字段类型

SQLAlchemy 创建模型类的时候,跟mysql使用sql语句去创建表很流程很相似。

1、id主键列需要自己定义

2、需要指定字段类型

3、需要指定约束条件

4、表关系

常用的SQLAlchemy字段类型

类型名 python中类型 说明
Integer int 普通整数,一般是32位
SmallInteger int 小整数
BigInteger int或long 大整数
Float float 浮点数
Numeric decimal.Decimal 普通整数,一般是32位
String str 变长字符串
Text str 变长字符串,对较长或不限长度的字符串做了优化
Unicode unicode 变长Unicode字符串
UnicodeText unicode 变长Unicode字符串,对较长或不限长度的字符串做了优化
Boolean bool 布尔值
Date datetime.date 时间
Time datetime.datetime 日期和时间
LargeBinary str 二进制文件

约束条件

约束 说明
primary_key 主键
unique 唯一约束,True不允许重复
index 索引,如果为True,为这列创建索引,提高查询效率
nullable 空值, 如果为True,允许有空值,如果为False,不允许有空值
default 默认值

关系

关系 说明
One To Many(一对多) 表示一对多的关系时,在子表类中通过 foreign key (外键)引用父表类,在父表类中通过 relationship() 方法来引用子表的类
One To One(一对一) 一对一是两张表之间本质上的双向关系。只需要在一对多关系基础上的父表中使用 uselist=False 参数来表示
Many To Many(多对多) 多对多关系会在两个类之间增加一个关联的表,连个关系表中使用 relationship() 方法中通过 secondary 来引用关联表,关联表通过 MetaData 对象来与声明基类关联,使用ForeignKey 连接接来定位到远程的表

创建模型类

一对多关系:

class Father(db.Model):
    """创建一个父亲模型类"""
    # 表名
    __tablename__ = 'father'
    # id主键列,整数类型,自增
    id = db.Column(db.Integer,primary_key=True)
    # name,可变长字符串类型
    name = db.Column(db.String(20))
    # 关系字段,不是数据库中真实存在的字段,而是为了方便查询添加的属性
    son = db.relationship('Son', backref='father')

class Son(db.Model):
    # 表名
    __tablename__ = 'son'
    # id主键列,整数类型,自增
    id = db.Column(db.Integer,primary_key=True)
    # name,可变长字符串类型
    name = db.Column(db.String(20))
    # 外键,需要指定字段类型,以及关联那个表的那个字段
    father_id = db.Column(db.Integer, db.ForeignKey('father.id'))

一对一关系:

class Father(db.Model):
    """创建一个父亲模型类"""
    # 表名
    __tablename__ = 'father'
    # id主键列,整数类型,自增
    id = db.Column(db.Integer,primary_key=True)
    # name,可变长字符串类型
    name = db.Column(db.String(20))
    # 关系字段,不是数据库中真实存在的字段,而是为了方便查询添加的属性
    son = db.relationship('Son', backref='father',uselist=False)

class Son(db.Model):
    # 表名
    __tablename__ = 'son'
    # id主键列,整数类型,自增
    id = db.Column(db.Integer,primary_key=True)
    # name,可变长字符串类型
    name = db.Column(db.String(20))
    # 外键,需要指定字段类型,以及关联那个表的那个字段
    father_id = db.Column(db.Integer, db.ForeignKey('father.id'))

多对多关系:


# 多对多关系中的两个表之间的一个关联表
association_table = db.Table('association', db.metadata,
    db.Column('author_id', db.Integer, db.ForeignKey('author.id')),
    db.Column('book_id', db.Integer, db.ForeignKey('book.id'))
)

class  Author(db.Model):

    """ 创建作者模型类"""
    # 指定表名,如果没有指定将默认使用模型类的名称
    __tablename__ = 'author'
    # id 类型是整数 主键列
    id = db.Column(db.Integer, primary_key=True)
    # name 类型是可变长字符串,唯一
    name = db.Column(db.String(20), unique=True)

    # 关联中间表,不是数据库中真实存在的字段,而是为了方便查询添加的属性
    book = db.relationship('Book', back_populates='author', secondary=association_table)


class Book(db.Model):
    """创建书模型类"""
    # 指定表名,如果不指定将使用模型类名称作为表名
    __tablename__ = 'book'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(20))

    # 关联中间表,不是数据库中真实存在的字段,而是为了方便查询添加的属性
    author = db.relationship("Author", secondary=association_table, back_populates="book")
Iyoyo电子书 一本集作者多年开发经验的python电子书 all right reserved,powered by Gitbook文件修订时间: 2022年 18:24:56