SQLAlchemy Model 创建
Model 创建
模型是 ORM 中很重要的概念,SQLAlchemy 正是将 Model 类映射到数据库表,进而方便操作数据库。
1. 如何创建模型类
Column
实例化的对象就是来映射数据库中的字段。declarative_base
生成声明式映射基类- 新定义的模型类要继承自基类
- 导入所需的数据类型
- 引用字段需采用字符串形式
from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy.orm import declarative_base
from datetime import datetime
# 定义表
class User(Base): # user 表映射成 User 类
__tablename__ = 'user' # User.__tablename__ 就是表名,表名小写
uid = Column(Integer, primary_key=True) # 类属性映射为字段,需要用引用 Column 来定义字段
name = Column(String(10), nullable=False)
created_time = Column(DateTime, default=datetime.now)
update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now) # 用 datetime.now 而不是 datetime.now()
# def __repr__(self):
# return # 访问模型时,返回模型参数,需要自己定义
2. 模型类的属性介绍
2.1 __tablename__
定义表名,字符串类型。
2.2 Column()
Column
常用参数说明:
name
数据库中表示的此列的名称type_
列的类型*args
包括 Constraint, ForeignKey, ColumnDefault, Sequence, Computed Identityautoincrement
为整数主键列设置“自动递增”语义default
设置默认值,但不在表中设置默认值约束server_default
设置默认值约束index
为该列设置索引nullable
非空约束onupdate
更新默认值primary_key
将此列标记为主键列unique
唯一约束comment
设置注释
2.3 __table_args__
可以来添加显式约束。
例如设置联合唯一约束:
__table_args__ = {
UniqueConstraint('hid', 'username', name='hid_username_i')
}
3. 几种约束的设置方法
3.1 主键约束
隐式:
class User(Base):
__tablename__ = 'user'
uid = Column(Integer, primary_key=True)
显式:
class User(Base):
__tablename__ = 'user'
uid = Column(Integer)
__table_args__ = {
PrimaryKeyConstraint('uid')
}
3.2 联合主键约束
隐式:
class User(Base):
__tablename__ = 'user'
uid = Column(Integer, primary_key=True)
aid = Column(Integer, primary_key=True)
显式:
class User(Base):
__tablename__ = 'user'
uid = Column(Integer)
aid = Column(Integer)
__table_args__ = {
PrimaryKeyConstraint('uid', 'aid')
}
3.3 非空约束
class User(Base):
__tablename__ = 'user'
uid = Column(Integer, nullable=False)
3.4 唯一约束
隐式:
class User(Base):
__tablename__ = 'user'
name = Column(Integer, unique=True)
显式:
class User(Base):
__tablename__ = 'user'
name = Column(Integer)
__table_args__ = {
UniqueConstraint('name')
}
3.5 联合唯一约束
class User(Base):
__tablename__ = 'user'
name = Column(Integer)
addr = Column(Integer)
__table_args__ = {
UniqueConstraint('name', 'addr')
}
3.6 默认值约束
class User(Base):
__tablename__ = 'user'
country = Column(String(20), server_default='China')
3.7 自增约束
class User(Base):
__tablename__ = 'user'
uid = Column(Integer, autoincrement=True)
3.8 外键约束
隐式:
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(50))
class Book(Base):
__tablename__ = 'books'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=False)
content = Column(Text, nullable=False)
uid = Column(Integer, ForeignKey('users.id')) # 定义外键
显式:
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(50))
class Book(Base):
__tablename__ = 'books'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=False)
content = Column(Text, nullable=False)
uid = Column(Integer)
__table_args__ = {
ForeignKeyConstraint('uid', 'users.id')
}
3.9 联合外键约束
class User(Base):
__tablename__ = 'users'
uid = Column(Integer, primary_key=True)
aid = Column(Integer, primary_key=True)
name = Column(String(50))
class Book(Base):
__tablename__ = 'books'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=False)
content = Column(Text, nullable=False)
uid = Column(Integer)
aid = Column(Integer)
__table_args__ = {
ForeignKeyConstraint(['uid', 'aid'], ['users.uid', 'users.aid'])
}
3.10 外键约束的选项
以字符串形式存在 ondelete
和 onupdate
参数里。
uid = Column(Integer, ForeignKey('user.id', onupdate="CASCADE", ondelete="CASCADE"))
- RESTRICT:若子表中有父表对应的关联数据,删除父表对应数据,会阻止删除。默认项
- NO ACTION:在MySQL中,同RESTRICT。
- CASCADE:级联删除。
- SET NULL:父表对应数据被删除,子表对应数据项会设置为NULL。
评论区(暂无评论)