使用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()
本文介绍了如何使用 SQLAlchemy 在 Python 中创建数据库表的外键约束,并详细解释了不同类型的外键约束行为,如 RESTRICT、CASCADE、NOACTION 和 SETNULL。示例代码展示了如何设置这些约束,并通过实际例子展示了如何在 user 和 article 表之间建立级联删除关系。文章还包含了数据库连接和 ORM 操作的实例。
897

被折叠的 条评论
为什么被折叠?



