使用SQLAlchemy创建外键非常简单。在从表中增加一个字段,指定这个字段外键的是哪个表的哪个字段就可以了。从表中外键的字段,必须和父表的主键字段类型保持一致。 示例代码如下:
class User(Base): __tablename__ = 'user' id = Column(Integer,primary_key=True,autoincrement=True) username = Column(String(50),nullable=False) class Article(Base): __tablename__ = 'article' id = Column(Integer,primary_key=True,autoincrement=True) title = Column(String(50),nullable=False) content = Column(Text,nullable=False) uid = Column(Integer,ForeignKey("user.id"))
外键约束有以下几项:
-
RESTRICT:父表数据被删除,会阻止删除。默认就是这一项。
uid = Column(Integer,ForeignKey("user.id",ondelete="RESTRICT")
约束一旦形成,要从user表中删除id=1的数据,就会被拒绝
-
NO ACTION:在MySQL中,同RESTRICT。
-
CASCADE:级联删除,删除一个带动一个
uid = Column(Integer,ForeignKey("user.id",ondelete="CASCADE")
-
SET NULL:父表数据被删除,子表数据会设置为NULL。
uid=Column(Integer,ForeignKey("user.id",ondelete="SET NULL"))
代码如下:
from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,Date,DateTime,Time,String,Text,func,and_,or_,ForeignKey from sqlalchemy.dialects.mysql import LONGTEXT from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker,relationship # 在Python3中才有这个enum模块,在python2中没有 import enum from datetime import datetime import random HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'pysql' USERNAME = 'root' PASSWORD = '123456' # dialect+driver://username:password@host:port/database DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE) engine = create_engine(DB_URI) Base = declarative_base(engine) session = sessionmaker(engine)() # 父表 / 从表 # user/article class User(Base): __tablename__='user' id=Column(Integer,primary_key=True,autoincrement=True) username=Column(String(50),nullable=False) class Article(Base): __tablename__='article' id=Column(Integer,primary_key=True,autoincrement=True) title=Column(String(50),nullable=False) content=Column(Text,nullable=False) uid=Column(Integer,ForeignKey("user.id",ondelete="SET NULL")) Base.metadata.drop_all() Base.metadata.create_all() user=User(username="xiaodi") session.add(user) session.commit() article=Article(title='abc',content='123',uid=1) session.add(article) session.commit()