如圖爲兩個數據庫的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)