SQLAlchemy Model 创建
2022年 05月 13 日

子弹

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 Identity
  • autoincrement 为整数主键列设置“自动递增”语义
  • 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 外键约束的选项

以字符串形式存在 ondeleteonupdate 参数里。

uid = Column(Integer, ForeignKey('user.id', onupdate="CASCADE", ondelete="CASCADE"))
  • RESTRICT:若子表中有父表对应的关联数据,删除父表对应数据,会阻止删除。默认项
  • NO ACTION:在MySQL中,同RESTRICT。
  • CASCADE:级联删除。
  • SET NULL:父表对应数据被删除,子表对应数据项会设置为NULL。

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 Identity
  • autoincrement 为整数主键列设置“自动递增”语义
  • 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 外键约束的选项

以字符串形式存在 ondeleteonupdate 参数里。

uid = Column(Integer, ForeignKey('user.id', onupdate="CASCADE", ondelete="CASCADE"))
  • RESTRICT:若子表中有父表对应的关联数据,删除父表对应数据,会阻止删除。默认项
  • NO ACTION:在MySQL中,同RESTRICT。
  • CASCADE:级联删除。
  • SET NULL:父表对应数据被删除,子表对应数据项会设置为NULL。

赞 (0)

评论区(暂无评论)

这里空空如也,快来评论吧~

我要评论