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