[PYTHON] Tipps zur Definition von sqlalchemy-Tabellen

tips

Die Version ist 0.9.4

Angeben des Datenbankmoduls

Kann mit __table_args__ angegeben werden

__table_args__ = {'mysql_engine': 'InnoDB'}

Einzigartige Beschränkung

Einfach für eine einzelne Spalte, aber eindeutige Einschränkungen für mehrere Spalten Sie müssen sqlalchemy.schema.UniqueConstraint verwenden

#Einzelne Spalte
name = Column("name", String(255), unique=True)
#Mehrere Spalten
__table_args__ = (UniqueConstraint("personid", "address", name="unique_idx_personid_address"))
#Name muss nicht angegeben werden

Darüber hinaus scheint es notwendig zu sein, "UniqueConstraint" in "()" einzuschließen, um es mit der obigen InnoDB-Spezifikation zu kombinieren.

__table_args__ = (
            (UniqueConstraint('personid', 'address', name='unique_idx_personid_address')),
            {'mysql_engine': 'InnoDB'})

Externe Schlüsselbeschränkung

Verwenden Sie "sqlalchemy.ForeignKey" für externe Schlüsseleinschränkungen Unterstützt "ON UPDATE" und "ON DELETE" Geben Sie auf der referenzierten Seite auch "sqlalchemy.orm.relationship" an Wenn "backref" angegeben ist, handelt es sich um eine Referenz aus beiden Richtungen. Referenz: http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html

#Referrer
#Tabellenname im Fremdschlüssel.Geben Sie den Spaltennamen an
personid = Column('personid', Integer(unsigned=True), \
                  ForeignKey('person.id',onupdate='CASCADE', ondelete='CASCADE'))
#Referenzierte Seite
#Beziehung mit demselben Einzug wie die Spaltendefinition(Name der Tabellenklasse(Kein Tabellenname))
address = relationship("Address")
# address = relationship("Address", backref="person")

NULL

Schreiben Sie einfach "nullable = [True or False]" in die Spaltendefinition

Int ohne Vorzeichen in MySQL

Verwenden Sie "sqlalchemy.dialects.mysql.INTEGER", um "INTEGER (unsigned = True)" zu erstellen Ich weiß nichts anderes als "mysql", aber es scheint, dass es unterstützt wird, weil es in "sqlalchemy.dialects" andere RDMS wie "oracle" und "sqlite" gibt.

Tabellendefinitionsvorlage?

Es scheint, dass Sie es nur verwenden können, indem Sie es ein wenig kopieren und damit spielen Unterstützt MySQL Beachten Sie, dass create database [Datenbankname] Standardzeichensatz utf8; auf der MySQL-Seite ausgeführt werden muss.

# -*- encoding:utf-8 -*-

from sqlalchemy import (Column, String, Text, ForeignKey, \
                create_engine, MetaData, DECIMAL, DATETIME, exc, event, Index)
from sqlalchemy.schema import UniqueConstraint
from sqlalchemy.orm import (sessionmaker, relationship, scoped_session)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.dialects.mysql import INTEGER as Integer
from datetime import datetime

engine = create_engine('mysql://{user}:{passwd}@{host}/{db}'\
        .format(user=user, passwd=passwd, host=host, db=db_name),\
        encoding='utf-8', echo=False)

Session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))

metadata = MetaData(engine)
Base = declarative_base()


class Person(Base):
    __tablename__ = 'person'
    __table_args__ = {'mysql_engine': 'InnoDB'}
    id = Column('id', Integer(unsigned=True), primary_key=True, autoincrement=True)
    name = Column('name', String(255), index=True, unique=True)
    age = Column('age', Integer)
    created = Column('created', DATETIME, default=datetime.now, nullable=False)
    modified = Column('modified', DATETIME, default=datetime.now, nullable=False)
    address = relationship('Address')

    def __init__(self, name, age):
        self.name = name
        self.age = age
        now = datetime.now()
        self.created = now
        self.modified = now


class Address(Base):
    __tablename__ = 'address'
    __table_args__ = (
            (UniqueConstraint('personid', 'address', name='unique_idx_personid_address')),
            {'mysql_engine': 'InnoDB'})
    id = Column('id', Integer, primary_key=True, autoincrement=True)
    personid = Column('personid', Integer(unsigned=True), ForeignKey('person.id',
        onupdate='CASCADE', ondelete='CASCADE'))
    address = Column('address', String(255), nullable=False)
    created = Column('created', DATETIME, default=datetime.now, nullable=False)
    modified = Column('modified', DATETIME, default=datetime.now, nullable=False)

    def __init__(self, personid, address):
        self.personid = personid
        self.address = address
        now = datetime.now()
        self.created = now
        self.modified = now

if __name__ == "__main__":
    # create table
    Base.metadata.create_all(engine)

Wenn dies ausgeführt wird, wird die folgende Tabelle erstellt.

mysql> desc person; +----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | UNI | NULL | | | age | int(11) | YES | | NULL | | | created | datetime | NO | | NULL | | | modified | datetime | NO | | NULL | | +----------+------------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec)

mysql> desc address; +----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | personid | int(10) unsigned | YES | MUL | NULL | | | address | varchar(255) | NO | | NULL | | | created | datetime | NO | | NULL | | | modified | datetime | NO | | NULL | | +----------+------------------+------+-----+---------+----------------+

mysql> show index from person \G; *************************** 1. row *************************** Table: person Non_unique: 0 Key_name: PRIMARY Seq_in_index: 1 Column_name: id Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment: *************************** 2. row *************************** Table: person Non_unique: 0 Key_name: ix_person_name Seq_in_index: 1 Column_name: name Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE Comment: 2 rows in set (0.00 sec)

ERROR: No query specified

mysql> show index from address \G; *************************** 1. row *************************** Table: address Non_unique: 0 Key_name: PRIMARY Seq_in_index: 1 Column_name: id Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment: *************************** 2. row *************************** Table: address Non_unique: 0 Key_name: unique_idx_personid_address Seq_in_index: 1 Column_name: personid Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE Comment: *************************** 3. row *************************** Table: address Non_unique: 0 Key_name: unique_idx_personid_address Seq_in_index: 2 Column_name: address Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment: 3 rows in set (0.00 sec)

ERROR: No query specified

Recommended Posts

Tipps zur Definition von sqlalchemy-Tabellen
Tabellendefinition in SQL Alchemy
Holen Sie sich die Tabelle dynamisch mit sqlalchemy
Generieren Sie mithilfe von sqlacodegen SQL Alchemy-Tabellendefinitionen von einem vorhandenen MySQL-Server
Verarbeitung von DB-Tabelleneinfügungen mit sqlalchemy
sqlalchemy