flask-sqlalchemy 多数据库 使用实例

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)

猜你喜欢

转载自blog.csdn.net/weixin_39595606/article/details/89514420