2013-10-13 25 views
0

我有一個數據庫關係的禁令和帳戶。一個帳戶可以有多個禁令。我的課是這樣的:加入並在sqlachachamy查詢

class Account(Base): 
    __tablename__ = "accounts" 

    _accountId = Column(Integer, name="accountId", primary_key=True) 
    _username = Column(String, name="username") 
    _password = Column(String, name="password") 
    _salt = Column(String, name="salt") 
    _lastLoggedIn = Column(String, name="lastLoggedIn") 
    _banned = relationship("Banned") 

class Banned(Base): 
    __tablename__ = 'bannedAccounts' 
    _id = Column(Integer, name="Id", primary_key=True) 
    _accountId = Column(Integer, ForeignKey('accounts.accountId'), name="accountId") 
    _reason = Column(String, name="Reason") 
    _expires = Column(String, name="Expires") 

我試圖做的,包括用一個用戶名選擇所有賬戶和加入它被取締的表,看看他們是否有任何禁令的查詢。我的代碼目前看起來是這樣的:

engine = create_engine(self.connectionString) 
Session = sessionmaker(bind=engine) 
session = Session() 

query = session.query(Account, Banned) 
query = query.filter(Account._username == self.username).filter(Account._accountId == Banned._accountId).all() 

我的問題是,它會只要他們有一些禁令返回賬戶和匹配self.username其相關禁令的元組。但是,如果他們沒有任何禁令而不是獲取賬戶對象,我會返回None。有沒有什麼辦法解決這一問題?

編輯 終點我想在SQL是這個

SELECT * 
FROM accounts 
LEFT JOIN bannedaccounts 
ON accounts.accountId = bannedaccounts.AccountID 
WHERE username= self.username 
+0

什麼是當前正在生成的SQL?您希望用查詢創建的SQL是什麼? –

+0

我該如何檢查sql是由什麼生成的?是不是從生成sql抽象的orm點?我已經編輯了第一篇文章,內容是我在sql中的目標。我相信我發現問題在於它做了一個正常的連接,而不是左連接。然而,我似乎無法解決如何告訴它在我建立關係時執行左連接 – zidsal

+1

您必須[啓用SQLAlchemy日誌記錄](http://docs.sqlalchemy.org/en/rel_0_8/core/ engines.html#用到dbengine日誌記錄)。儘管ORM的「重點」可能涉及到「抽象數據庫」這個概念的某個地方,但事實是它不能完美地實現這一點(http://www.joelonsoftware.com/articles/LeakyAbstractions.html )。我關於生成的SQL的問題略有修辭;當調試任何ORM時,您將不得不深入研究SQL。那麼可以認爲,ORM的「重點」就是它所做的所有事情,包括複雜的SQL生成。 –

回答

2

爲確定一次我打開日誌記錄,默認情況下SQLAlchamy做一個內部聯接(當我想要一個左連接問題)。要解決此問題,我們可以將查詢更改爲此

query = session.query(Account, Banned).outerjoin(Banned) 
    query = query.filter(Account._username == self.username).all() 
+1

我還應該提到查詢對象本身在轉換時轉換爲SQL字符串所以,如果你離開了'all()',並打印了所得到的'query',你還可以看到生成的SQL查詢,'all()'是實際上導致查詢運行在數據庫。 –