Flask扩展之flask-sqlalchemy(上)
flask-sqlalchemy是flask的一个ORM扩展框架,这个扩展在sqlalchemy的进行的扩展,更方便的结合Flask.
什么是ORM?
其是Object Relational Mapping的缩写,中文:对象关系映射,说白了就是程序中的实体类通过ORM可以映射成为数据库中的表,方便我们通过程序的方式操作数据表,这里就包括数据表的生成、删除、关系创建及表记录的增删改查。
【config.py】
SQLALCHEMY_DATABASE_URI='mysql://root:[email protected]: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 小时。
所有数据类型