tips
Die Version ist 0.9.4
Kann mit __table_args__
angegeben werden
__table_args__ = {'mysql_engine': 'InnoDB'}
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'})
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
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.
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