加入并查询sqlalchemy

时间:2013-10-13 15:44:37

标签: python sqlalchemy

我有禁令和帐户的数据库关系。一个帐户可以有多个禁令。我的课程看起来像这样:

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

1 个答案:

答案 0 :(得分:2)

我打开日志记录后发现的问题是默认情况下SQLAlchemy执行内连接(我想要一个左连接)。要解决此问题,我们可以将查询更改为此

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