| 知乎专栏 |
导入数据类型
from sqlalchemy import Column, Integer, String, Float, DECIMAL, Boolean, Enum, Date, DateTime, Time from sqlalchemy.dialects.mysql import LONGTEXT
主键
id = Column(Integer, primary_key=True, autoincrement=True)
price = Column(Float) # 总共有 20 位, 保留 5 位小说 price = Column(DECIMAL(20, 5)) is_delete = Column(Boolean) create_time = Column(DateTime) content = Column(LONGTEXT)
指定字段名
name = Column('fullname', String(60))
枚举字段
gender = Column(Enum('男', '女'))
默认值
name = Column(String(20), default=None, nullable=False, comment="姓名")
default 默认是是 sqlalchemy 产生的,我们需要让数据库完成默认值的填充,就需要使用 server_default
class PictureBookHasPicture(Base):
__tablename__ = "picture_book_has_picture"
id = Column(BIGINT, autoincrement=True, primary_key=True, comment="主键")
picture_book_id = Column(
Integer,
ForeignKey("picture_book.id", ondelete="CASCADE", onupdate="CASCADE"),
nullable=False,
comment="绘本ID",
)
picture_id = Column(
BIGINT, ForeignKey("picture.id"), nullable=False, comment="图片ID"
)
ctime = Column(DateTime, server_default=text("now()"), comment="创建时间")
ON UPDATE
class PictureBookHasPicture(Base):
__tablename__ = "picture_book_has_picture"
id = Column(BIGINT, autoincrement=True, primary_key=True, comment="主键")
picture_book_id = Column(
Integer,
ForeignKey("picture_book.id", ondelete="CASCADE", onupdate="CASCADE"),
nullable=False,
comment="绘本ID",
)
picture_id = Column(
BIGINT, ForeignKey("picture.id"), nullable=False, comment="图片ID"
)
ctime = Column(DateTime, server_default=text("now()"), comment="创建时间")
mtime = Column(
DateTime,
server_default=text("NULL ON UPDATE CURRENT_TIMESTAMP"),
comment="更新时间",
)
输出结果
CREATE TABLE `picture_book_has_picture` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `picture_book_id` int NOT NULL COMMENT '绘本ID', `picture_id` bigint NOT NULL COMMENT '图片ID', `ctime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `mtime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `picture_book_id` (`picture_book_id`), KEY `picture_id` (`picture_id`), CONSTRAINT `picture_book_has_picture_ibfk_1` FOREIGN KEY (`picture_book_id`) REFERENCES `picture_book` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `picture_book_has_picture_ibfk_2` FOREIGN KEY (`picture_id`) REFERENCES `picture` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
给表增加注释 __table_args__ = {"comment": "安卓设备表"}
class Android(Base):
__tablename__ = "android"
__table_args__ = {"comment": "安卓设备表"}
android_id = Column(String(16), primary_key=True, comment="安卓设备ID")
sn = Column(String(18), nullable=False, unique=True, comment="序列号")
version = Column(String(16), nullable=False, unique=False, comment="软件版本")
model = Column(String(16), nullable=False, unique=False, comment="产品型号")
mac = Column(String(48), nullable=True, unique=True, comment="MAC地址")
class MemberHasAndroid(Base):
__tablename__ = "member_has_android"
__table_args__ = (
PrimaryKeyConstraint("member_id", "android_id"),
{"comment": "会员设备"},
)
member_id = Column(Integer, ForeignKey("member.id"), nullable=False, comment="安卓ID")
android_id = Column(
String(16), ForeignKey("android.android_id"), nullable=False, comment="安卓ID"
)
CREATE TABLE `member_has_android` ( `member_id` int NOT NULL COMMENT '安卓ID', `android_id` varchar(16) COLLATE utf8mb4_general_ci NOT NULL COMMENT '安卓ID', PRIMARY KEY (`member_id`,`android_id`), KEY `android_id` (`android_id`), CONSTRAINT `member_has_android_ibfk_1` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`), CONSTRAINT `member_has_android_ibfk_2` FOREIGN KEY (`android_id`) REFERENCES `android` (`android_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='会员设备'
class Picture(Base):
__tablename__ = "picture"
id = Column(BIGINT, autoincrement=True, primary_key=True, comment="唯一ID")
android_id = Column(String(16), nullable=False, comment="安卓设备ID")
session = Column(String(36), nullable=False, unique=True, comment="回话ID")
prompt = Column(String(250), nullable=False, comment="提示词")
thumbnail = Column(String(250), nullable=True, comment="缩图")
original = Column(String(250), nullable=True, comment="原始图片")
image = Column(String(250), nullable=True, comment="图片")
story = Column(TEXT, nullable=True, comment="故事")
share = Column(Boolean, nullable=False, default=True, comment="共享")
like = Column(INTEGER, nullable=False, default=0, comment="点赞")
ctime = Column(DateTime, default=datetime.now(), comment="创建时间")
mtime = Column(DateTime, default=datetime.now(), comment="修改时间")
class PictureLike(Base):
__tablename__ = "picture_like"
id = Column(BIGINT, autoincrement=True, primary_key=True, comment="唯一ID")
android_id = Column(String(16), nullable=False, comment="安卓设备ID")
picture_id = Column(
BIGINT, ForeignKey("picture.id"), nullable=False, comment="图片ID"
)
ctime = Column(DateTime, default=datetime.now(), comment="创建时间")
RESTRICT: 若子表中有父表对应的关联数据,删除父表对应数据,会阻止删除。默认项 NO ACTION: 在MySQL中,同RESTRICT。 CASCADE: 级联删除。 SET NULL: 父表对应数据被删除,子表对应数据项会设置为NULL。
class PictureBook(Base):
__tablename__ = "picture_book"
id = Column(Integer, autoincrement=True, primary_key=True, comment="主键")
title = Column(String(50), nullable=False, comment="绘本名称")
author = Column(String(50), nullable=False, comment="作者")
cover = Column(String(50), nullable=False, comment="封面")
description = Column(String(250), nullable=False, comment="描述")
copyright = Column(String(250), nullable=False, comment="版权")
isbn = Column(String(13), nullable=True, comment="ISBN")
publisher = Column(String(13), nullable=True, comment="出版社")
editon = Column(String(13), nullable=True, comment="编辑")
ctime = Column(DateTime, default=datetime.now(), comment="创建时间")
mtime = Column(
DateTime, default=datetime.now(), onupdate=datetime.now(), comment="修改时间"
)
class PictureBookHasPicture(Base):
__tablename__ = "picture_book_has_picture"
id = Column(BIGINT, autoincrement=True, primary_key=True, comment="主键")
picture_book_id = Column(
Integer, ForeignKey("picture_book.id", ondelete='CASCADE'), nullable=False, comment="绘本ID"
)
picture_id = Column(
BIGINT, ForeignKey("picture.id"), nullable=False, comment="图片ID"
)
ctime = Column(DateTime, default=datetime.now(), comment="创建时间")
mtime = Column(DateTime, default=datetime.now(), comment="修改时间")
输出结果
CREATE TABLE `picture_book_has_picture` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `picture_book_id` int NOT NULL COMMENT '绘本ID', `picture_id` bigint NOT NULL COMMENT '图片ID', `ctime` datetime DEFAULT NULL COMMENT '创建时间', `mtime` datetime DEFAULT NULL COMMENT '修改时间', PRIMARY KEY (`id`), KEY `picture_book_id` (`picture_book_id`), KEY `picture_id` (`picture_id`), CONSTRAINT `picture_book_has_picture_ibfk_1` FOREIGN KEY (`picture_book_id`) REFERENCES `picture_book` (`id`) ON DELETE CASCADE, CONSTRAINT `picture_book_has_picture_ibfk_2` FOREIGN KEY (`picture_id`) REFERENCES `picture` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
class PictureBookHasPicture(Base):
__tablename__ = "picture_book_has_picture"
id = Column(BIGINT, autoincrement=True, primary_key=True, comment="主键")
picture_book_id = Column(
Integer,
ForeignKey("picture_book.id", ondelete="CASCADE", onupdate="CASCADE"),
nullable=False,
comment="绘本ID",
)
picture_id = Column(
BIGINT, ForeignKey("picture.id"), nullable=False, comment="图片ID"
)
ctime = Column(DateTime, server_default=text("now()"), comment="创建时间")
mtime = Column(
DateTime, server_default=None, server_onupdate=text("now()"), comment="更新时间"
)
CREATE TABLE `picture_book_has_picture` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `picture_book_id` int NOT NULL COMMENT '绘本ID', `picture_id` bigint NOT NULL COMMENT '图片ID', `ctime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `mtime` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), KEY `picture_book_id` (`picture_book_id`), KEY `picture_id` (`picture_id`), CONSTRAINT `picture_book_has_picture_ibfk_1` FOREIGN KEY (`picture_book_id`) REFERENCES `picture_book` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `picture_book_has_picture_ibfk_2` FOREIGN KEY (`picture_id`) REFERENCES `picture` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci