flask使用SQLAlchemy连接多个数据库进行orm操作

如图为两个数据库的models:

models为项目默认的数据库:通过settings中SQLALCHEMY_DATABASE_URI参数配置。
wink_model为连接的第二个只读数据库:通过settings中SQLALCHEMY_BINDS参数配置。
详见:SQLALCHEMY连接多个数据库配置

SQLALCHEMY_BINDS = {
         'winkdb': "{}+{}://{}:{}@{}:{}/{}?charset=utf8mb4".format("mysql","pymysql","root",123456,"127.0.0.1",3306,"db_name"),
    }
在model模型中要指定 __bind_key__ = 'winkdb'指向该数据库,如果没有则会自动使用默认的数据库。
如果两个数据库共同使用一个SQLAlchemy()对象,也可正常查询只是不能使用db.session.ecxute("sql语句")直接执行sql语句,查询时没有使用model模型而是直接使用数据库连接引擎直接执行sql语句所以会使用默认数据库进行查询。
所以最好再创建一个SQLAlchemy()对象并指定那个数据库引擎——>wink_db = SQLAlchemy(session_options={"bind": create_engine(
settings.config.get("HouseDevelopConfig").SQLALCHEMY_BINDS.get("winkdb"), pool_recycle=7200, pool_size=50)})

这样不管怎样查询就都可以了。

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
from WinkChat import settings


wink_db = SQLAlchemy(session_options={"bind": create_engine(
    settings.config.get("HouseDevelopConfig").SQLALCHEMY_BINDS.get("winkdb"), pool_recycle=7200, pool_size=50)})


class Tod(wink_db.Model):
    __bind_key__ = 'winkdb'
    id = wink_db.Column(wink_db.Integer, primary_key=True)
    name = wink_db.Column(wink_db.String(64))  # 
    photo_id = wink_db.Column(wink_db.BigInteger, default=0)  #
    lang = wink_db.Column(wink_db.JSON)  # 
    vip = wink_db.Column(wink_db.SmallInteger, default=0)  # 
    price = wink_db.Column(wink_db.Integer, default=0)  # 
    status = wink_db.Column(wink_db.SmallInteger, default=0)  # 

    __mapper_args__ = {
        "order_by": name.desc()
    }

几种简单查询:

from Wink.crm_model.wink_model import Tod
from Wink.crm_model.wink_model import wink_db

 1. tods = wink_db.session.query(Tod).all() 
 2. tods = Tod.query.all()
 3. tods = Tod.query.filter(Tod.id=1)

 4. tods = wink_db.session.execute("select * from tod") 
 5. tods = wink_db.session.execute("select * from tod where id={}".format(1))
 # 字符串拼接sql可以但最好使用下边的参数绑定方式,防止sql注入。

from sqlalchemy import text
tod_sql = text("select * from tod where id=:tod_id")
# 参数传字典可直接执行
 1. tods = wink_db.session.execute(tod_sql, {'tod_id': 1}) 
 # 传key=参数需要先创建一个connection()对象
 2. conn =wink_db.session.connection()
	tods = conn.execute(tod_sql, tod_id=1)
for td in tods:
    print(td.name)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用SQLAlchemy连接多个数据库使用连接池,你可以创建多个连接池对象并为每个数据库创建一个独立的引擎。以下是一个示例代码,展示了如何使用SQLAlchemy连接连接多个MySQL数据库: ```python from sqlalchemy import create_engine from sqlalchemy.pool import QueuePool # 创建连接池1 pool1 = QueuePool( creator=lambda: mysql.connector.connect( host='localhost', database='database1', user='username1', password='password1' ), pool_size=5 ) # 创建连接池2 pool2 = QueuePool( creator=lambda: mysql.connector.connect( host='localhost', database='database2', user='username2', password='password2' ), pool_size=5 ) # 创建SQLAlchemy引擎1 engine1 = create_engine('mysql+mysqlconnector://', creator=pool1.get) # 创建SQLAlchemy引擎2 engine2 = create_engine('mysql+mysqlconnector://', creator=pool2.get) # 将DataFrame写入数据库1的表 df.to_sql(name='table1', con=engine1, if_exists='replace', index=False) # 将DataFrame写入数据库2的表 df.to_sql(name='table2', con=engine2, if_exists='replace', index=False) ``` 在上面的代码中,你需要将`database1`、`username1`、`password1`替换为第一个数据库的实际信息,将`database2`、`username2`、`password2`替换为第二个数据库的实际信息。 通过创建多个连接池对象和引擎对象,你可以连接多个MySQL数据库,并使用连接池管理数据库连接。 希望这可以满足你的需求!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值