ORM-外键关联基本使用
程序员文章站
2022-05-05 16:33:08
...
外键
-
在Mysql中,外键可以让表之间关系变得更加紧密, 在SQlAlchemy中,
通过ForeignKey类来实现,并且可以指定表的外键约束
-
FroeignKey的导入
from sqlalchemy import ForeignKey
- 在从表中条件一个模型类.字段(属性)即可
uid = Column(数据类型(必须跟绑定主表类型一致), ForeignKey("表名.属性", ondelete="删除约束"))
外键关联的代码和示例图
图说明
外键约束的删除
如果删除了主表中的数据, 从表的数据会怎么样? 需要设置
"RESTRICT" : 主表数据被删除, 会阻止删除
"NO ACTION: 在mysql中, 同 RESTRICT"
"CASEADE" 级联删除, 如果主表删除了数据, 从表的数据也会跟在一起都删除
"SET NULL" 主表数据被删除, 从表数据会设置为NULL
代码
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
HOST = "127.0.0.1"
PORT = "3306"
DATABASE = "test_sql"
USERNAME = "root"
PASSWORD = "root"
DB_URI = "mysql+mysqlconnector://{username}:{password}@{host}:{post}/{db}?charset=utf8".format(username=USERNAME, password=PASSWORD, host=HOST, post=PORT, db=DATABASE)
# 创建数据库引擎
engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()
class User(Base):
__tablename__ = "user"
id = Column(Integer, autoincrement=True, primary_key=True)
username = Column(String(20), nullable=False)
class Fiction(Base):
__tablename__ = "fiction"
id = Column(Integer, primary_key=True, autoincrement=True)
fiction_name = Column(String(20), nullable=False)
uid = Column(Integer, ForeignKey("user.id", ondelete="CASCADE"))
# Base.metadata.drop_all()
# Base.metadata.create_all()
user = User(username="辰东")
session.add(user)
session.commit()
fiction = Fiction(fiction_name="遮天", uid=1)
session.add(fiction)
session.commit()
# fiction = Fiction(fiction_name="完美世界", uid=session.query(User).get(1).id)
# session.add(fiction)
# session.commit()