使用SQLAlchemy创建外键

本文介绍了如何使用 SQLAlchemy 在 Python 中创建数据库表的外键约束,并详细解释了不同类型的外键约束行为,如 RESTRICT、CASCADE、NOACTION 和 SETNULL。示例代码展示了如何设置这些约束,并通过实际例子展示了如何在 user 和 article 表之间建立级联删除关系。文章还包含了数据库连接和 ORM 操作的实例。
摘要由CSDN通过智能技术生成

使用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"))

外键约束有以下几项:

  1. RESTRICT:父表数据被删除,会阻止删除。默认就是这一项。

     uid = Column(Integer,ForeignKey("user.id",ondelete="RESTRICT")

    约束一旦形成,要从user表中删除id=1的数据,就会被拒绝

  2. NO ACTION:在MySQL中,同RESTRICT。

  3. CASCADE:级联删除,删除一个带动一个

    uid = Column(Integer,ForeignKey("user.id",ondelete="CASCADE")

  4. 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()

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值