我真的不具備查詢你試圖表達一個完整的瞭解,天氣這是一個工會或加入或一些第三件事,而是放在一邊,那肯定是可能映射任意可選(任何可以傳遞給返回行的數據庫)。
我首先假設您需要TableA和TableB的某種聯合,這將是A中的所有行,並且還包含B中的所有行。這很容易更改爲如果您透露更多關於您所表達的數據的形狀的信息,則可以使用不同的概念。
我們將從聲明式風格開始,設置真實的表格和類來映射它們。
from sqlalchemy import *
import sqlalchemy.ext.declarative
Base = sqlalchemy.ext.declarative.declarative_base()
class TableA(Base):
__tablename__ = 'a'
id = Column(Integer, primary_key=True)
a_code = Column(String)
class TableB(Base):
__tablename__ = 'b'
id = Column(Integer, primary_key=True)
b_code = Column(String)
由於我們使用了聲明,我們實際上沒有表實例工作從,這是neccesary下一個部分。訪問表的方法有很多種,但我更喜歡使用sqlalchemy映射內省方法,因爲無論類如何映射,該方法都可以工作。
from sqlalchemy.orm.attributes import manager_of_class
a_table = manager_of_class(TableA).mapper.mapped_table
b_table = manager_of_class(TableB).mapper.mapped_table
接下來,我們需要一個代表,我們感興趣的是數據的實際SQL表達式。 這是一個聯盟,這導致看起來一樣在第一類中定義的列,id
列和a_code
。我們可以重命名它,但這不是示例中非常重要的一部分。
ab_view_sel = sqlalchemy.alias(a_table.select().union(b_table.select()))
最後,我們將一個類映射到此。有可能爲此使用聲明式,但實際上更多的代碼是這樣做的,而不是傳統的映射風格,而不是更少。請注意,從類繼承object
,不base
class ViewAB(object):
pass
sqlalchemy.orm.mapper(ViewAB, ab_view_sel)
而這幾乎是它。當然這有一些限制;最明顯的是沒有(簡單)的方法將ViewAB
的實例保存回數據庫。
你的問題毫無意義。您無法使用未映射的表或任何其他數據查詢數據庫。你的問題有什麼奇怪的用例?如果你有N:M的關係,那麼正確的建模。否則,你的方法看起來像設計中斷。你正在試圖打擊這個框架。 – 2011-04-12 19:00:28
假表數據在哪裏?你的意思是映射到JOIN-ed查詢(這是SQLAlchemy支持的)還是你想處理內存中的一些數據? – 2011-04-13 13:52:21