flask-sqlalchemy 多数据库连接实例
* flask配置
# 默认数据库
class Config:
SQLALCHEMY_DATABASE_URI = "mysql://root:[email protected]:3306/kdsk"
# 默认数据库配置,不指定数据库时使用此数据库
SQLALCHEMY_BINDS = {
'mysql2': 'mysql://root:[email protected]:3306/kdsk'
}
# 除了默认数据库外的其他数据库
*模型代码
不同数据库映射的实体模型类应放在不同的文件中,并继承自自定义属性类
'''
文件:models1.py,数据库1映射的实体模型类
'''
class FuncModel:
# 设置自定义类统一的属性和方法
# 这里使用默认的数据库连接配置
def save(self):
# 快捷保存数据库对象到数据库中
db.session.add(self)
db.session.commit()
class User(db.Model, FuncModel):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String, default="NoUsername")
'''
文件:models2.py,数据库2映射的实体模型类
'''
class FuncModel:
# 设置自定义类统一的属性和方法
__bind_key__ = 'mysql2'
# 这里使用数据库2的连接配置,只需要在模型类中加入字段__bind_key__
# 字段值应和配置中config.SQLALCHEMY_BINDS 所设置的键对应
def save(self):
# 快捷保存数据库对象到数据库中
db.session.add(self)
db.session.commit()
class Article(db.Model, FuncModel):
'''
从FuncModel继承可获得事先设置好的__bind_key__字段,指定数据库
其他模型类也应该这样处理
'''
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String)
多数据库配置下执行纯sql语句
querys = db.session.execute("SELECT DATE_FORMAT(record.time, '%Y-%m-%d') AS t,sum(score) AS sumscore FROM record GROUP BY t ORDER BY t desc limit 7")
直接使用db.session的函数时,会连接默认数据库配置
这时候需要在函数中加入参数bind,传入自己实例化的数据库连接
from sqlalchemy import create_engine
engine = create_engine(current_app.config['SQLALCHEMY_BINDS']['mysql2'])
# current_app.config['SQLALCHEMY_BINDS'] 是程序启动后,在请求路由函数中使用的,相当于配置中的congfig.SQLALCHEMY_BINDS
querys = db.session.execute("SELECT DATE_FORMAT(record.time, '%Y-%m-%d') AS t,sum(score) AS sumscore FROM record GROUP BY t ORDER BY t desc limit 7", bind=engine)