一個選項是反映特定的賬戶相關表。這是關於此事的SqlAlchemy Documentation。
或者,您可以使用靜態schema
屬性創建表並根據需要在運行時更新它並運行所需的查詢。我想不出一種非雜亂的方式來做到這一點。因此,這裏是凌亂的選項
無論何時切換帳戶,都使用循環更新每個表定義中的模式屬性。
添加帳戶特定於列表的所有表。
-
- 如果表在聲明語法表達,那麼你就必須修改
DeclarativeName.__table__.schema
屬性。我不確定你是否需要修改DeclarativeName.__table_args__['schema']
,但我想它不會受到傷害。
- 如果表格以舊式表格語法表示,則必須修改
Table.schema
屬性。
如果您使用文本任何關係或外鍵,那麼將打破,你必須檢查是否有這樣的硬編碼使用每個表並改變它們
例如
user_id = Column(ForeignKey('my_schema.user.id'))
需要寫成user_id = Column(ForeignKey(User.id))
。然後,您可以將User
的架構更改爲my_new_schema
。否則,在查詢時間sqlalchemy將被混淆,因爲外鍵將指向my_schema.user.id
,而查詢將指向my_new_schema.user
。
我不確定是否可以在不使用純文本的情況下表達更復雜的關係,所以我想這是我提出的解決方案的限制。
這是我在終端寫了一個例子:
>>> from sqlalchemy import Column, Table, Integer, String, select, ForeignKey
>>> from sqlalchemy.orm import relationship, backref
>>> from sqlalchemy.ext.declarative import declarative_base
>>> B = declarative_base()
>>>
>>> class User(B):
... __tablename__ = 'user'
... __table_args__ = {'schema': 'first_schema'}
... id = Column(Integer, primary_key=True)
... name = Column(String)
... email = Column(String)
...
>>> class Posts(B):
... __tablename__ = 'posts'
... __table_args__ = {'schema':'first_schema'}
... id = Column(Integer, primary_key=True)
... user_id = Column(ForeignKey(User.id))
... text = Column(String)
...
>>> str(select([User.id, Posts.text]).select_from(User.__table__.join(Posts)))
'SELECT first_schema."user".id, first_schema.posts.text \nFROM first_schema."user" JOIN first_schema.posts ON first_schema."user".id = first_schema.posts.user_id'
>>> account_specific = [User, Posts]
>>> for Tbl in account_specific:
... Tbl.__table__.schema = 'second_schema'
...
>>> str(select([User.id, Posts.text]).select_from(User.__table__.join(Posts)))
'SELECT second_schema."user".id, second_schema.posts.text \nFROM second_schema."user" JOIN second_schema.posts ON second_schema."user".id = second_schema.posts.user_id'
正如你看到相同的查詢是指second_schema
後,我更新的表的模式屬性。
您能否提供一個有關導致此錯誤和堆棧跟蹤的代碼的工作示例? –
我很感謝這裏的幫助,但我現在不得不經過一個動態模式的想法,只是有一個應用程序的視圖。我花了太多的時間試圖做到這一點,雖然我沒有使用SA成功,但我還有其他問題。 –