[PYTHON] Erstellen Sie mit SQLAlchemy Ihren eigenen zusammengesetzten Wert

Der zusammengesetzte Wert ist ein Muster in PofEAA, das ein einfaches Wertobjekt, das ein Attribut einer Entität ist, als mehrere Spalten in der Tabelle abbildet, der die Entität zugeordnet ist.

Es gibt auch ein ähnliches Muster namens Serialized LOB, das ein Objekt in JSON usw. serialisiert und in ein BLOB oder CLOB einfügt. Composite Value hat den Vorteil, dass es im Vergleich zu Serialized LOB aus SQL verwendet werden kann.

Ein Beispiel für die Ausführung von Composite Value mit SQLAlchemy finden Sie in der Originaldokumentation. Composite Column Types

In diesem Beispiel ist jedoch kein Operator definiert, sodass nur ein Vergleich gleicher Werte möglich ist. Sie können den SQL-Generierungsteil auch mithilfe von "compare_factory" anpassen. Da jedoch das Beispiel dieses Teils getrennt wurde, habe ich ein Beispiel zum Zusammenstellen erstellt.

Dieses Beispiel ist einfacher, da zum Erstellen eines Wertobjekts ein benanntes Tupel verwendet wird.

composite_example.py


# -*- coding: utf-8 -*-
from __future__ import division, print_function, absolute_import

from collections import namedtuple
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm.properties import CompositeProperty
from sqlalchemy.orm import composite, sessionmaker, configure_mapper

#Kopie aus dem ORM-Tutorial
Base = declarative_base()
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(engine)


#Bereichstyp, der diesmal das Wertobjekt ist. Es gibt Anfang und Ende.
class Range(namedtuple('Range', 'start end')):

    #Diese Methode gibt den im Taple zugeordneten Wert zurück.
    #Da namedtuple ein Tapple ist, reicht es aus, sich selbst zurückzugeben
    def __composite_values__(self):
        return self

    #Dies ist nur eine Methode. Verwendung über Instanzmitglied
    def includes(self, value):
        return self.start <= value < self.end


#Dies ist die Person, die SQL generiert
class RangeComparator(CompositeProperty.Comparator):
    #Methode zum Generieren von SQL.Lassen Sie uns die Methode und Verwendung von Value Object anpassen
    def includes(self, value):
        #Extrahieren Sie die zugeordnete Spalte. Dieser Teil ist eine Kopie.
        start, end = self.__clause_element__().clauses
        # and_()Generieren Sie SQL mit.
        return and_(start <= value, value < end)


#Hilfsfunktion
def range_composite(start, end):
    return composite(Range, start, end, comparator_factory=RangeComparator)


class MyTable(Base):
    __tablename__ = 'mytable'
    id = Column(Integer, primary_key=True)
    foo_start = Column(Integer)
    foo_end = Column(Integer)
    foo_range = range_composite(foo_start, foo_end)

    def __repr__(self):
        return "MyTable(foo_start={0.foo_start!r}, foo_end={0.foo_end!r}".format(self)


#Für dieses Beispiel nicht erforderlich.Aber für komplexe Projekte muss man das tun
#Da es Fälle gibt, in denen die SQL-Generierung fehlschlägt, weil die Zuordnung über mehrere Klassen nicht abgeschlossen ist.
#Lassen Sie es uns tun, nachdem Sie alle Modelle definiert haben.
# configure_mappers()


print("Create tables")
Base.metadata.create_all(engine)

session = Session()
print("Insert test data")
session.add(MyTable(foo_start=10, foo_end=100))
session.add(MyTable(foo_start=100, foo_end=200))
session.add(MyTable(foo_start=1, foo_end=10))
session.commit()

print("Select using filter")
# RangeComparator.includes()Kann zum Erstellen des Filterteils verwendet werden
values = session.query(MyTable).filter(MyTable.foo_range.includes(42)).all()
print("values:", values)

#Natürlich Range.includes()Kann in einer Instanz normal verwendet werden
v = values[0]
print("test")
print(9, v.foo_range.includes(9))
print(10, v.foo_range.includes(10))
print(99, v.foo_range.includes(99))
print(100, v.foo_range.includes(100))

Die Ausgabe sieht so aus.

Create tables
2014-01-15 22:59:15,334 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("mytable")
2014-01-15 22:59:15,334 INFO sqlalchemy.engine.base.Engine ()
2014-01-15 22:59:15,335 INFO sqlalchemy.engine.base.Engine
CREATE TABLE mytable (
	id INTEGER NOT NULL,
	foo_start INTEGER,
	foo_end INTEGER,
	PRIMARY KEY (id)
)


2014-01-15 22:59:15,335 INFO sqlalchemy.engine.base.Engine ()
2014-01-15 22:59:15,335 INFO sqlalchemy.engine.base.Engine COMMIT
Insert test data
2014-01-15 22:59:15,336 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2014-01-15 22:59:15,337 INFO sqlalchemy.engine.base.Engine INSERT INTO mytable (foo_start, foo_end) VALUES (?, ?)
2014-01-15 22:59:15,337 INFO sqlalchemy.engine.base.Engine (10, 100)
2014-01-15 22:59:15,337 INFO sqlalchemy.engine.base.Engine INSERT INTO mytable (foo_start, foo_end) VALUES (?, ?)
2014-01-15 22:59:15,337 INFO sqlalchemy.engine.base.Engine (100, 200)
2014-01-15 22:59:15,338 INFO sqlalchemy.engine.base.Engine INSERT INTO mytable (foo_start, foo_end) VALUES (?, ?)
2014-01-15 22:59:15,338 INFO sqlalchemy.engine.base.Engine (1, 10)
2014-01-15 22:59:15,338 INFO sqlalchemy.engine.base.Engine COMMIT
Select using filter
2014-01-15 22:59:15,339 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2014-01-15 22:59:15,340 INFO sqlalchemy.engine.base.Engine SELECT mytable.id AS mytable_id, mytable.foo_start AS mytable_foo_start, mytable.foo_end AS mytable_foo_end
FROM mytable
WHERE mytable.foo_start <= ? AND mytable.foo_end > ?
2014-01-15 22:59:15,340 INFO sqlalchemy.engine.base.Engine (42, 42)
values: [MyTable(foo_start=10, foo_end=100]
test
9 False
10 True
99 True
100 False

Recommended Posts

Erstellen Sie mit SQLAlchemy Ihren eigenen zusammengesetzten Wert
Erstellen Sie mit Twisted Ihren eigenen DNS-Server
Erstellen Sie Ihre eigene Ausnahme
Memo zum Erstellen einer eigenen Box mit Peppers Python
Erstellen Sie Ihre eigene Django-Middleware
Reinforcement Learning 23 Erstellen und verwenden Sie Ihr eigenes Modul mit Colaboratory
Erstellen Sie Ihren eigenen Namensauflösungsdienst
[Django] Erstellen Sie Ihre eigene 403, 404, 500-Fehlerseite
Trainiere UGATIT mit deinem eigenen Datensatz
Löse dein eigenes Labyrinth mit DQN
Ihr eigener Twitter-Client mit Django
Erstellen Sie Ihre eigenen Linux-Befehle in Python
[Stärkung des Lernens] DQN mit Ihrer eigenen Bibliothek
Erstellen Sie mit python3 eine Wortwolke aus Ihrem Tweet
[LLDB] Erstellen Sie Ihren eigenen Befehl mit Python
So importieren Sie Ihr eigenes Modul mit jupyter
Erstellen der ersten App mit Django Startprojekt
Veröffentlichen Sie Ihre eigene Python-Bibliothek auf Homebrew
Erstellen Sie mit Python + OpenCV Ihre eigene virtuelle Kamera und wenden Sie Originaleffekte an
Versuchen Sie, Ihr eigenes AWS-SDK mit bash zu erstellen
Erstellen Sie ein Bulletin Board mit Heroku, Flask, SQL Alchemy
Erstellen Sie schnell Ihr eigenes Modul mit setuptools (Python)
Trainieren Sie Stanford NER Tagger mit Ihren eigenen Daten
[Maschinelles Lernen] Erstellen Sie ein Modell für maschinelles Lernen, indem Sie Transferlernen mit Ihrem eigenen Datensatz durchführen
Erstellen Sie ein Rad Ihres eigenen OpenCV-Moduls
Erstelle deinen eigenen Musik-Player mit Bottle0.13 + jPlayer2.5!
Schritte zum Installieren Ihrer eigenen Bibliothek mit pip
Ablauf beim Erstellen eines eigenen Pakets mit setup.py mit Python
Rufen Sie mit Go mit cgo Ihre eigene C-Sprachbibliothek auf
Erstellen Sie Ihre eigenen Big Data in Python zur Validierung
Erstellen Sie Ihr eigenes Random Dot Stereogram (RDS) in Python.
Schreiben Sie Ihre eigene Aktivierungsfunktion mit Pytorch (hartes Sigmoid)
Rufen wir Ihre eigene C ++ - Bibliothek mit Python auf (Einstellungen)
Definieren Sie Ihre eigene Distanzfunktion mit k-Mitteln des Scikit-Lernens
[Blender x Python] Erstellen Sie Ihre eigene Funktion und Zusammenfassung
Erstelle Spiele mit Pygame
Erstellen Sie einen Filter mit scipy
Verwenden Sie Enum mit SQLAlchemy
Versuchen Sie, Ihre eigenen Objekte mit Prioritätswarteschlangen in Python zu sortieren
Führen Sie die Intelligenz Ihrer eigenen Python-Bibliothek mit VScode aus.
Ihre URL hat nicht mit dem Wert des Challenge-Parameters geantwortet.
Lernen Sie "x86-Architektur mit Ihrem eigenen Emulator" mit Manjaro (Linux)
Ich habe versucht, einen Artikel mit SQL Alchemy auf Wiki.js zu erstellen