flask-sqlalchemy 多数据库 使用实例

本文介绍如何在Flask应用中配置和使用SQLAlchemy进行多数据库连接,包括配置示例、模型类定义及纯SQL语句执行技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

flask-sqlalchemy 多数据库连接实例

* flask配置

# 默认数据库
class Config:
	SQLALCHEMY_DATABASE_URI = "mysql://root:rootttt.@192.168.0.198:3306/kdsk"
	# 默认数据库配置,不指定数据库时使用此数据库
	SQLALCHEMY_BINDS = {
	        'mysql2': 'mysql://root:rootttt.@192.168.0.199: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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值