我有一個數據庫關係的禁令和帳戶。一個帳戶可以有多個禁令。我的課是這樣的:加入並在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
什麼是當前正在生成的SQL?您希望用查詢創建的SQL是什麼? –
我該如何檢查sql是由什麼生成的?是不是從生成sql抽象的orm點?我已經編輯了第一篇文章,內容是我在sql中的目標。我相信我發現問題在於它做了一個正常的連接,而不是左連接。然而,我似乎無法解決如何告訴它在我建立關係時執行左連接 – zidsal
您必須[啓用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生成。 –