一:配置参数
配置名 | 备注 |
---|---|
SQLALCHEMY_DATABASE_URI | 连接数据库URI |
SQLALCHEMY_BINDS | 一个映射 binds 到连接 URI 的字典。更多 binds 的信息见用 Binds 操作多个数据库 |
SQLALCHEMY_ECHO | 如果设置为Ture, SQLAlchemy 会记录所有 发给 stderr 的语句,对调试有用 |
SQLALCHEMY_RECORD_QUERIES | 可以用于显式地禁用或启用查询记录。查询记录 在调试或测试模式自动启用。更多信息见get_debug_queries() |
SQLALCHEMY_NATIVE_UNICODE | 可以用于显式禁用原生 unicode 支持。当使用 不合适的指定无编码的数据库默认值时,这对于 一些数据库适配器是必须的(比如 Ubuntu 上 某些版本的 PostgreSQL ) |
SQLALCHEMY_POOL_SIZE | 数据库连接池的大小。默认是引擎默认值(通常 是 5 ) |
SQLALCHEMY_POOL_TIMEOUT | 设定连接池的连接超时时间。默认是 10 |
SQLALCHEMY_POOL_RECYCLE | 多少秒后自动回收连接。这对 MySQL 是必要的, 它默认移除闲置多于 8 小时的连接。注意如果 使用了 MySQL , Flask-SQLALchemy 自动设定 这个值为 2 小时 |
二:ORM模型类参数说明
字段类型:
类型名 | python中的类型 | 说明 |
---|---|---|
Integer | int | 普通整数,一般是32位 |
SmallInteger | int | 取值范围小的整数,一般是16位 |
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 | 如果为True,代表表的主键 |
unique | 如果为True,代表这列不允许出现重复的值 |
index | 如果为True,为这列创建索引,提高查询效率 |
nullable | 如果为True,允许有空值,如果为False,不允许有空值 |
default | 为这列定义默认值 |
关系选项:
选项名 | 说明 |
---|---|
backref | 在关系的另一模型中添加反向引用 |
primaryjoin | 明确指定两个模型之间使用的联结条件 |
uselist | 如果为False,不使用列表,而使用标量值 |
order_by | 指定关系中记录的排序方式 |
secondary | 指定多对多关系中关系表的名字 |
secondary join | 在SQLAlchemy中无法自行决定时,指定多对多关系中的二级联结条件 |
参考文章:
备注:表设计样例
from applications import db
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
class BaseModel:
is_delete = db.Column(db.Integer, default=0, comment='是否删除(0未删除,1已删除)')
create_time = db.Column(db.DateTime, default=datetime.now, comment='创建时间')
update_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='修改时间')
class User(db.Model, BaseModel):
__tablename__ = 'user'
__table_args__ = {'comment': '用户表'}
user_id = db.Column('user_id', db.Integer, primary_key=True, comment='用户ID')
username = db.Column('username', db.String(12), comment='登录名', nullable=False)
password = db.Column('password', db.String(225), comment='登录密码', nullable=False)
user_email = db.Column('user_email', db.String(25), comment='用户邮箱')
user_email_code = db.Column('user_email_code', db.Integer, comment='用户邮箱校验码')
user_email_is_active = db.Column('user_email_is_active', db.Integer, comment='用户是否激活邮箱')
user_state = db.Column('user_state', db.Integer, default=0, comment='用户状态(0启用,1禁用)')
user_sex = db.Column('user_sex', db.Integer, default=0, comment='用户性别(0男,1女)')
user_qq = db.Column('user_qq', db.String(25), comment='用户qq')
user_tel = db.Column('user_tel', db.String(11), comment='用户电话')
user_xueli = db.Column('user_xueli', db.String(25), comment='用户学历')
user_hobby = db.Column('user_hobby', db.String(50), comment='用户爱好')
user_introduce = db.Column('user_introduce', db.String(200), comment='用户介绍')
# 关联到角色表
role = db.relationship('Role', backref='user', lazy='dynamic')
def set_password(self, password):
self.password = generate_password_hash(password)
def validate_password(self, password):
return check_password_hash(self.password_hash, password)
def to_dict(self):
return {
"id": self.user_id,
"username": self.username,
"mobile": self.user_tel,
"email": self.user_email,
"user_state": self.user_state,
"is_delete": self.is_delete,
"create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S ")
}
class Role(db.Model, BaseModel):
__tablename__ = 'role'
__table_args__ = {'comment': '角色表'}
role_id = db.Column('role_id', db.Integer, primary_key=True, comment='角色ID')
role_name = db.Column('role_name', db.String(12), unique=True, comment='角色名称')
role_pers = db.Column('role_pers', db.String(122), comment='角色所拥有的权限')
role_dec = db.Column('role_dec', db.String(122), comment='角色描述')
user_id = db.Column('user_id', db.Integer, db.ForeignKey('user.user_id'))
# 关联到权限表
permission = db.relationship('Permission', backref='role', lazy='dynamic')
class Permission(db.Model, BaseModel):
__tablename__ = 'permission'
__table_args__ = {'comment': '权限表'}
per_id = db.Column('per_id', db.Integer, primary_key=True, comment='权限ID')
per_name = db.Column('per_name', db.String(12), comment='权限名称')
per_pid = db.Column('per_pid', db.Integer, comment='权限父级ID')
per_level = db.Column('per_level', db.Integer, comment='权限父级等级')
per_path = db.Column('per_path', db.String(25), comment='权限路径')
per_control = db.Column('per_control', db.String(12), comment='权限方法')
role_id = db.Column('role_id', db.Integer, db.ForeignKey('role.role_id'), comment='角色ID')
class Menu(db.Model, BaseModel):
__tablename__ = 'menu'
__table_args__ = {'comment': '菜单表'}
menu_id = db.Column('menu_id', db.Integer, primary_key=True, comment='菜单ID')
menu_name = db.Column('menu_name', db.String(12), comment='菜单名称')
menu_pid = db.Column('menu_pid', db.Integer, comment='菜单父级ID')
menu_path = db.Column('menu_path', db.String(25), comment='菜单路径')
menu_control = db.Column('menu_control', db.String(12), comment='菜单方法')
menu_order = db.Column('menu_order', db.Integer, comment='菜单个数')