摘要:前言一般來(lái)說(shuō)解決連接多個(gè)庫(kù)的最簡(jiǎn)單的方式是新建兩個(gè)或多個(gè)相互沒有關(guān)聯(lián)配置不同的來(lái)連接這樣的話正常配置就行不用特殊配置如果這樣解決的話也就不用看下面的配置了不可以加上如下的五種方式都是可以的這個(gè)配置很關(guān)鍵很關(guān)鍵這個(gè)配置很關(guān)鍵用戶工
前言
一般來(lái)說(shuō),解決sqlalchemy 連接多個(gè)庫(kù)的最簡(jiǎn)單的方式是新建兩個(gè)或多個(gè)db.session 相互沒有關(guān)聯(lián),modle配置不同的db.session來(lái)連接,這樣的話,relationship正常配置就行,不用特殊配置.如果這樣解決的話,也就不用看下面的配置了
# -*- coding:utf-8 -*- import flask from flask_sqlalchemy import SQLAlchemy # Flask-SQLAlchemy 2.3.2 from datetime import datetime from sqlalchemy.orm import backref, foreign # SQLAlchemy 1.3.1 app = flask.Flask(__name__) app.config["DEBUG"] = True app.config["SQLALCHEMY_BINDS"] = { "read_db": "mysql://reader:test@127.0.0.1:3306/test?charset=utf8", "write_db": "mysql://writer:test@127.0.0.2:3306/test?charset=utf8" } app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False app.config["SQLALCHEMY_ECHO"] = False db = SQLAlchemy(app) class RDriver(db.Model): __bind_key__ = "read_db" __tablename__ = "driver" # __table_args__ = {"schema": "test"} # 不可以加上 id = db.Column(db.Integer, primary_key=True, autoincrement=True) fk_user_id = db.Column(db.Integer, db.ForeignKey("user.id")) driver_name = db.Column(db.String(7)) create_time = db.Column(db.TIMESTAMP, default=datetime.now) class RUser(db.Model): __bind_key__ = "read_db" __tablename__ = "user" # __table_args__ = {"schema": "test"} id = db.Column(db.Integer, primary_key=True, autoincrement=True) user_name = db.Column(db.String(32), index=True, unique=True) user_password = db.Column(db.String(32)) create_time = db.Column(db.TIMESTAMP, default=datetime.now) update_time = db.Column(db.TIMESTAMP, default=datetime.now) # 如下的五種方式都是可以的 # driver_fk = db.relationship("RDriver", foreign_keys="RDriver.fk_user_id") # driver_fk = db.relationship("RDriver", primaryjoin=lambda: RDriver.fk_user_id == RUser.id, viewonly=True) # driver_fk = db.relationship("RDriver", primaryjoin=RDriver.fk_user_id == id) fk_driver = db.relationship("RDriver", primaryjoin="RDriver.fk_user_id == RUser.id") # driver_fk = db.relationship("RDriver", backref=db.backref("user", lazy=True), # primaryjoin=lambda: RDriver.fk_user_id == RUser.id, viewonly=True) class WDriver(db.Model): __bind_key__ = "write_db" __tablename__ = "driver" __table_args__ = {"schema": "test", "extend_existing": True} # 這個(gè)配置很關(guān)鍵 id = db.Column(db.Integer, primary_key=True, autoincrement=True) fk_user_id = db.Column(db.Integer, db.ForeignKey("test.user.id")) # test.user.id很關(guān)鍵 plate = db.Column(db.String(7)) create_at = db.Column(db.TIMESTAMP, default=datetime.now) class WUser(db.Model): __bind_key__ = "write_db" __tablename__ = "user" __table_args__ = {"schema": "test", "extend_existing": True} # 這個(gè)配置很關(guān)鍵 id = db.Column(db.Integer, primary_key=True, autoincrement=True) hash = db.Column(db.String(256), nullable=False) user_no = db.Column(db.String(32), index=True, unique=True) # 用戶工號(hào) create_time = db.Column(db.TIMESTAMP, default=datetime.now) update_time = db.Column(db.TIMESTAMP, default=datetime.now) # 以下五種方式都是可以的 # fk_driver = db.relationship("WDriver", foreign_keys="WDriver.fk_user_id", uselist=False) # fk_driver = db.relationship("WDriver", primaryjoin=lambda: WDriver.fk_user_id == WUser.id) fk_driver = db.relationship("WDriver", primaryjoin=WDriver.fk_user_id == id) # fk_driver = db.relationship("WDriver", primaryjoin="WDriver.fk_user_id == WUser.id") # fk_driver = db.relationship("WDriver", backref=db.backref("test.user", lazy=True), # primaryjoin=lambda: WDriver.fk_user_id == WUser.id) r_user_obj = RUser.query.filter_by().first() print("r_user_obj:", r_user_obj) print("r_user_obj.driver_fk:", r_user_obj.fk_driver) w_user_obj = WUser.query.filter_by(id=2188).first() print("w_user_obj:", w_user_obj) print("w_user_obj.driver_fk:", w_user_obj.fk_driver)參考文檔:
* https://docs.sqlalchemy.org/en/13/orm/relationship_api.html # 值得細(xì)看 * https://www.osgeo.cn/sqlalchemy/orm/relationship_api.html # 同上,中文 * https://www.cnblogs.com/srd945/p/9851227.html * extend_existing: (False)當(dāng)表已經(jīng)存在于元數(shù)據(jù)中時(shí),如果元數(shù)據(jù)中存在與column_list中的列同名的列,column_list中同名的列會(huì)替換掉元數(shù)據(jù)中已經(jīng)有的列 * useexisting已被廢棄, 新版本使用extend_existing總結(jié)
關(guān)系配置參數(shù)真的很多,如下,很容易就會(huì)出錯(cuò),需要多讀讀官方文檔,還有就是建立modle時(shí)候盡量簡(jiǎn)潔,風(fēng)格統(tǒng)一,不要在數(shù)據(jù)庫(kù)層建立外鍵.
sqlalchemy.orm.relationship(argument, secondary=None, primaryjoin=None, secondaryjoin=None, foreign_keys=None, uselist=None, order_by=False, backref=None, back_populates=None, post_update=False, cascade=False, extension=None, viewonly=False, lazy="select", collection_class=None, passive_deletes=False, passive_updates=True, remote_side=None, enable_typechecks=True, join_depth=None, comparator_factory=None, single_parent=False, innerjoin=False, distinct_target_key=None, doc=None, active_history=False, cascade_backrefs=True, load_on_pending=False, bake_queries=True, _local_remote_pairs=None, query_class=None, info=None, omit_join=None)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/43929.html
摘要:關(guān)系關(guān)系數(shù)據(jù)庫(kù)通過(guò)使用關(guān)系在不同的表中建立連接。以下部分將介紹最常見的數(shù)據(jù)庫(kù)操作。如果數(shù)據(jù)庫(kù)已存在函數(shù)不會(huì)重新創(chuàng)建或更新數(shù)據(jù)庫(kù)表。到目前為止對(duì)象只存于中,他們還沒有被寫入數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)會(huì)話也叫事務(wù)。刪除行數(shù)據(jù)庫(kù)會(huì)話同樣有方法。 7、關(guān)系 關(guān)系數(shù)據(jù)庫(kù)通過(guò)使用關(guān)系在不同的表中建立連接。圖像5-1的關(guān)系圖表達(dá)了用戶和用戶角色之間的簡(jiǎn)單關(guān)系。這個(gè)角色和用戶是一對(duì)多關(guān)系,因?yàn)橐粋€(gè)角色可以從屬于...
閱讀 2546·2021-11-16 11:45
閱讀 2531·2021-10-11 10:59
閱讀 2325·2021-10-08 10:05
閱讀 3990·2021-09-23 11:30
閱讀 2433·2021-09-07 09:58
閱讀 938·2019-08-30 15:55
閱讀 826·2019-08-30 15:53
閱讀 1981·2019-08-29 17:00