[PYTHON] Tabellendefinition in SQL Alchemy

Einführung

Hier fassen wir die Methode zum Definieren einer Tabelle mit SQLAlchemy zusammen. ** Im Folgenden ist Dialekt (DB-Typ) MySQL. ** **.

Zeichensatzspezifikation

Es kann durch mysql_charset von __table_args__ angegeben werden. Zum Beispiel, wenn Sie einen Zeichensatz als utf8mb4 angeben möchten

class User(Base):
    __table_args__=({"mysql_charset": "utf8mb4"})

Und es ist ausreichend. Wenn Sie utf8 angeben, wird die Warnung übrigens wie folgt ausgegeben.

Warning: (3719, "'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.")

ROW_FORMAT=DYNAMIC Die maximale Schlüssellänge des Index beträgt 3072 Byte. Wenn die MySQL-Version jedoch 5.6 oder früher ist, beträgt der Standardwert 767 Byte. Wenn Sie 5.6 oder früher verwenden und wie folgt schreiben, tritt daher ein Fehler auf.

class User(Base):
    __table_args__=({"mysql_charset": "utf8mb4"})
    a=Column(String(255), unique=True)

Dies liegt daran, dass utf8mb4 angegeben ist, also 255 * 4 = 1020 (Byte), was 767 Bytes überschreitet. (Übrigens ist im Fall von utf8mb3 255 * 3 = 765 (Byte) in Ordnung) Durch Setzen von "ROW_FORMAT = DYNAMIC" beträgt die maximale Schlüssellänge des Index 3072 Byte. Sie können wie folgt schreiben.

class User(Base):
    __table_args__=({"mysql_charset": "utf8mb4", "mysql_row_format": "DYNAMIC"})
    a=Column(String(255), unique=True)

In 5.7 und höher ist standardmäßig "ROW_FORMAT = DYNAMIC".

DB-Motorspezifikation

Es kann durch mysql_engine von __table_args__ angegeben werden. Wenn Sie beispielsweise die DB-Engine für InnoDB angeben möchten,

class User(Base):
    __table_args__=({"mysql_engine": "InnoDB"})

Und es ist ausreichend. Data Types Als generische Typen von SQLAlchemy können Sie es importieren und mit from sqlalchemy.types import hogehoge verwenden. Zum Beispiel gibt es Folgendes.

from sqlalchemy.types import Float
from sqlalchemy.types import Integer
from sqlalchemy.types import String
from sqlalchemy.types import DateTime

Für diese generischen Typen wählt SQL Alchemy die entsprechenden Datentypen entsprechend dem DB-Typ aus, der bei "CREATE TABLE" verwendet werden soll. Offizielle Dokumente (generische Typen)

Beispielsweise sind vorzeichenlose int, tiny int und timestamp type in Generic Types nicht enthalten. Verwenden Sie in einem solchen Fall "from sqlalchemy.dialects.mysql import fugafuga".

from sqlalchemy.dialects.mysql import INTEGER as Integer
from sqlalchemy.dialects.mysql import TINYINT as Tinyint
from sqlalchemy.dialects.mysql import TIMESTAMP as Timestamp

class User(Base):
    a=Column(Integer(unsigned=True)) #a ist int ohne Vorzeichen int
    b=Column(Tinyint(1)) #b ist winzig int(1)
    c=Column(Timestamp) #c ist der Zeitstempel

(Offizielle Dokumentation (MySQL-Datentypen)) Primary Key Sie können primary_key = True in der Spalte setzen.

class User(Base):
    id=Column(Integer, primary_key=True) #ID ist Primärschlüssel

Wenn Sie einen zusammengesetzten Primärschlüssel erstellen möchten, setzen Sie für beide primary_key = True.

class User(Base):
    # id_1 und id_2 ist ein zusammengesetzter Primärschlüssel
    id_1=Column(Integer, primary_key=True)
    id_2=Column(Integer, primary_key=True)

Auto Increment Setzen Sie in der Spalte autoincrement = True.

class User(Base):
    id=Column(Integer, autoincrement=True) #ID ist Auto Increment

Standardwert

Setzen Sie "server_default = hogehoge" in die Spalte. Beachten Sie, dass Sie string oder text () an server_default übergeben müssen.

from sqlalchemy.dialects.mysql import TINYINT as Tinyint

class User(Base):
    bool=Column(Tinyint(1), server_default="1") #String übergeben

Wenn die übergebene Zeichenfolge eine Zeichenfolge ist, ändert sie sich in einfache Anführungszeichen, und wenn es sich um text () handelt, ändert sie sich ohne Anführungszeichen.

x=Column(String, server_default="val")
x STRING DEFAULT 'val' #Wechseln Sie zu einfachen Anführungszeichen
y=Column(DateTime, server_default=text("NOW()")
y DATETIME DEFAULT NOW() #kein Zitat

Offizielle Dokumentation (server_default)

Wenn der Standardwert current_timestamp sein soll, setzen Sie from sqlalchemy.sql.functions import current_timestamp und server_default = current_timestamp ().

from sqlalchemy.dialects.mysql import TIMESTAMP as Timestamp
from sqlalchemy.sql.functions import current_timestamp

class User(Base):
    created_at=Column(Timestamp, server_default=current_timestamp())

Offizielle Dokumentation (aktueller Zeitstempel) )

Wert aktualisieren

Es wird nicht wiedergegeben, selbst wenn "server_onupdate = hogehoge" in der Spalte festgelegt ist. Wenn Sie daher "DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" festlegen möchten, verwenden Sie "server_default".

from sqlalchemy.dialects.mysql import TIMESTAMP as Timestamp
from sqlalchemy.sql.expression import text

class User(Base):
    created_at=Column(Timestamp, server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))

Und es ist ausreichend. How to set DEFAULT ON UPDATE CURRENT_TIMESTAMP in mysql with sqlalchemy?

Null-Einschränkung

Sie können in der Spalte "nullable = False" setzen.

class User(Base):
    a=Column(Integer, nullable=False) #a ist int und nicht null

Einzigartige Beschränkung

Wenn Sie einer einzelnen Spalte eine eindeutige Einschränkung hinzufügen möchten, können Sie in der Spalte "unique = True" festlegen.

class User(Base):
    a=Column(Integer, unique=True) #a ist int und einzigartig

Wenn Sie eine eindeutige Einschränkung für mehrere Spalten festlegen möchten, müssen Sie "sqlalchemy.schema.UniqueConstraint" in "table_args" schreiben.

from sqlalchemy.schema import UniqueConstraint

class User(Base):
    #(a, b)In einzigartiger
    __table_args__=(UniqueConstraint("a", "b", name="uq_user_00"))
    a=Column(Integer)
    b=Column(Integer)

Natürlich können Sie "sqlalchemy.schema.UniqueConstraint" auch dann verwenden, wenn Sie eine eindeutige Einschränkung für eine einzelne Spalte festlegen möchten.

Fremdschlüsseleinschränkung

Wie benutzt man

Setzen Sie in der Spalte "sqlalchemy.schema.ForeignKey". Grundsätzlich sqlalchemy.schema.ForeignKey (" {tabellenname}. {Spaltenname} ", name =" {fremder_schlüssel_beschränkungsname} ")

from sqlalchemy.schema import ForeignKey

class User(Base):
    __tablename__="users"
    id=Column(Integer, nullable=False, autoincrement=True, primary_key=True)
    name=Column(String(255), nullable=False)

class TestResult(Base):
    __tablename__="test_results"
    id=Column(Integer, nullable=False, autoincrement=True, primary_key=True)
    value=Column(Integer, nullable=False)
    user_id=Column(Integer, ForeignKey("users.id", name="fk_test_results_00", nullable=False)) #Die ID der Benutzertabelle lautet ForeignKey

Wenn Sie OnUpdate oder OnDelete festlegen möchten, fügen Sie "onupdate =" CASCADE "oder" ondelete = "CASCADE" "in" sqlalchemy.schema.ForeignKey () "hinzu. Offizielles Dokument (ForeignKey.params.column) Als Einschränkung müssen unter den Optionen, die in Column geschrieben werden sollen, DataType und ForeignKey vorher und die mit "=" übergebenen Optionen danach geschrieben werden. relation Durch Erstellen einer Beziehung können Sie dem Fremdschlüssel folgen, ohne explizit beizutreten. Die Beziehung kann wie in der Spaltendefinition auf "hoge = sqlalchemy.orm.relationship (" {Klassenname} ", uselist = {True or False})" gesetzt werden. Uselist wird auf True gesetzt, wenn mehrere Daten verknüpft sind, und auf False, wenn nur eine vorhanden ist. Im Folgenden Benutzer: TestResult = eins: viele.

from sqlalchemy.schema import ForeignKey
from sqlalchemy.orm import relationship

class User(Base):
    __tablename__="users"
    id=Column(Integer, nullable=False, autoincrement=True, primary_key=True)
    name=Column(String(255), nullable=False)
    test_result=relationship("TestResult", uselist=True) #Erstellen Sie eine Beziehung zwischen Benutzer und TestResult,Mehrere zu verknüpfende Daten

class TestResult(Base):
    __tablename__="test_results"
    id=Column(Integer, nullable=False, autoincrement=True, primary_key=True)
    value=Column(Integer, nullable=False)
    user_id=Column(Integer, ForeignKey("users.id", name="fk_test_results_00", nullable=False)) #Die ID der Benutzertabelle lautet ForeignKey
    user=relationship("User") #Erstellen Sie eine Beziehung von TestResult zu User,Ein Datenelement zum Verbinden

Durch Festlegen einer solchen Beziehung können Sie eine Instanz jeder Klasse wie folgt aufrufen.


test_result_1=session.query(TestResult).filter(TestResult.id==1).one() # test_Rufen Sie in der Ergebnistabelle die mit der ID 1 ab.
user_of_test_result_1=test_result_1.user #test_result_1 Benutzer_Sie können eine Instanz der Benutzerklasse abrufen, deren ID mit der ID übereinstimmt.
# user_of_test_result_1=User

user_1=session.query(User).filter(User.id==1).one() #Rufen Sie in der Benutzertabelle die mit der ID 1 ab.
test_results_of_user_1=user_1.test_result # user_Benutzer-Matching-ID von 1_Sie können eine Liste der Instanzen der TestResult-Klasse mit der ID abrufen
# test_results_of_user_1=[TestResult, TestResult, ...]

Eine der Optionen ist faul, und mit diesem Parameter können Sie den Zeitpunkt festlegen, zu dem die Tabelle gelesen wird, auf die die Beziehung festgelegt ist. Standardmäßig wird es geladen, wenn es aufgerufen wird.

faul = "auswählen" (dasselbe gilt für "wahr")

Entspricht der Standardeinstellung. Es wird gelesen, wenn das Beziehungsziel aufgerufen wird.

test_result_1=session.query(TestResult).filter(TestResult.id==1).one() #Benutzer ist hier noch nicht geladen.
user_of_test_result_1=test_result_1.user #Benutzer wird hier geladen

lazy="immediate" Wenn die Beziehungsquelle aufgerufen wird, wird auch das Beziehungsziel aufgerufen. Die Abfrage wird separat ausgegeben, um die Beziehungsquelle und das Beziehungsziel aufzurufen.

test_result_1=session.query(TestResult).filter(TestResult.id==1).one() #Benutzer wird auch hier geladen

faul = "verbunden" (gleich für "Falsch")

Wenn die Beziehungsquelle aufgerufen wird, wird auch das Beziehungsziel aufgerufen. Der Unterschied zu faul = "sofort" besteht darin, wie oft die Abfrage ausgegeben wird. Da es durch Beitritt aufgerufen wird, kann die Abfrage nur einmal ausgegeben werden. Offizielles Dokument (Beziehung)

Verweise

Dieser Artikel wurde unter Bezugnahme auf die folgenden Informationen verfasst. ・ Offizielles Dokument

Recommended Posts

Tabellendefinition in SQL Alchemy
Tipps zur Definition von sqlalchemy-Tabellen
OperationalError in SQLAlchemy + SQLite3
Holen Sie sich die Tabelle dynamisch mit sqlalchemy
Benennen Sie Tabellenspalten in Django3 um
Ausgabe der Tabellenstruktur in Django
Sparen Sie Zeit mit SQLAlchemy
Generieren Sie mithilfe von sqlacodegen SQL Alchemy-Tabellendefinitionen von einem vorhandenen MySQL-Server
Implementieren Sie einen tabellengesteuerten Test in Java
Umgang mit Sitzungen in SQLAlchemy
Definition des Funktionsargumenttyps in Python
(sqlalchemy) Zeigt Text im Auswahlfeld an
Verarbeitung von DB-Tabelleneinfügungen mit sqlalchemy
sqlalchemy
Schreiben Sie eine kurze Eigenschaftsdefinition in Python
Ordnen Sie die in pythons models.py festgelegte Tabelle zu
So zeigen Sie die neunundneunzig Tabelle in Python an
Code für die API-Konvertierung in sqlalchemy erforderlich