flask-sqlalchemy 是 flask 的一个 ORM 扩展框架,这个扩展在 sqlalchemy 的进行的扩展,更方便的结合 Flask. 什么是 ORM? 其是 Object Relational Mapping 的缩写,中文:对象关系映射,说白了就是程序中的实体类通过 ORM 可以映射成为数据库中的表,方便我们通过程序的方式操作数据表,这里就包括数据表的生成、删除、关系创建及表记录的增删改查。【config.py】
SQLALCHEMY_DATABASE_URI=’mysql://root:mysql@127.0.0.1:3306/test’ // 数据库连接
SQLALCHEMY_TRACK_MODIFICATIONS=False
上面两项是必配置的属性,否则程序将不能正常运行:所有配置键见最后
【create_sur.py】
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
app.config.from_object(‘config.py’)
class User(db.Model):
__tablename__ = ‘user’ #指定表名,默认模型类小写
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(32))
def __repr__(self):
return ‘Role:%s’ % self.name
if __name__ == “__main__”:
db.create_all()
app.run()
这样子在 test 数据库下就生成了一张 user 表,是不是很简单。在进行数据的增删改查之前,我们先来看一下常用的操作语句:
常见操作语句
db.session.add(obj) 添加对象
db.session.add_all([obj1,obj2,..]) 添加多个对象
db.session.delete(obj) 删除对象
db.session.commit() 提交会话
db.session.rollback() 回滚
db.session.remove() 移除会话
增加数据
>>>from create_sur import db,User
>>>user1=User(name=’jim’)
>>>db.session.add(user1)
>>>db.session.commit() // 添加一条数据
>>>user2=User(name=’sam’)
>>>user3=User(name=’alice’)
>>>db.session.add_all([user2,user3]) // 批量添加数据
>>>db.session.commit()
查询数据
>>>from create_sur import db,User
>>>user_all=User.query.all() // 查询所有数据
>>>user=User.query.filter_by(name=’jim’).all() // 查询 name 为 jim 的数据
>>>user=User.query.filter(User.name=’sam’).first() // 查询 name 为 sam 的数据
常用过滤函数:
常用查询函数:
删除数据
// 在查询数据的基础上
>>>db.session.delete(obj) //obj 为查询后的数据对象
>>>db.session.commit()
更新数据
// 在查询数据的基础上通过修改对象的属性然后再添加达到更新的作用
>>>user=User.query.filter(User.name=’sam’).first() // 查询数据
>>>user.name=’sam_two’
>>>db.session.add(user)
>>>db.session.commit()
上面是一些简单的小例子,接下来我们写一个有外键关系的两个表的例子:【create_sur2.py】
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
app.config.from_object(‘config.py’)
class Role(db.Model):
# 定义表名
__tablename__ = ‘roles’
# 定义列对象
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
#设置关系属性, 方便查询使用
us = db.relationship(‘User’, backref=’role’)
#重写__repr__方法, 方便查看对象输出内容
def __repr__(self):
return ‘Role:%s’% self.name
class User(db.Model):
__tablename__ = ‘users’
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True, index=True)
password = db.Column(db.String(64))
role_id = db.Column(db.Integer, db.ForeignKey(‘roles.id’)) #定义外键
def __repr__(self):
return ‘User:%s’%self.name
上述有两个重点:
使用 ForeignKey 义外键属性
使用 relationship 方法定义两表的关系
接下来我们测试一下这两个方法的作用:
添加一些数据:
>>>from create_sur2 import db,User,Role
>>>ro1 = Role(name=’admin’)
>>>ro2 = Role(name=’user’)
>>>db.session.add_all([ro1,ro2])
>>>db.session.commit()
>>>us1 = User(name=’wang’, password=’123456′, role_id=ro1.id)
>>>us2 = User(name=’zhang’, password=’201512′, role_id=ro2.id)
>>>us3 = User(name=’chen’, password=’987654′, role_id=ro2.id)
>>>us4 = User(name=’zhou’, password=’456789′, role_id=ro1.id)
>>>db.session.add_all([us1,us2,us3,us4])
>>>db.session.commit()
测试一下查询:
>>>from create_sur2 import User,Role
>>>role=Role.query.get(1)
>>>role.User.all()
[User:wang,User:zhou] 这里之所以可以找到就是因为 relationship 通过外键作用实现的
>>>user=User.query.get(3)
>>>user.role
[Role:user] 这里之所以可以找到就是因为 relationship 的 backref 参数值实现的
所有配置清单
SQLALCHEMY_DATABASE_URI 用于连接的数据库 URI SQLALCHEMY_BINDS 一个映射 binds 到连接 URI 的字典 SQLALCHEMY_ECHO 如果设置为 Ture,SQLAlchemy 会记录所有 发给 stderr 的语句,这对调试有用。(打印 sql 语句)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 小时。
所有数据类型