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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值