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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章