【问题标题】:SQLalchemy retrieving id of row by filtersSQLalchemy通过过滤器检索行的ID
【发布时间】:2013-03-06 01:41:15
【问题描述】:

我正在尝试通过使用 2 个过滤器来获取行的 ID。 我通过使用 1 个过滤器让它工作,但是一旦我添加了第二个,事情就出错了。有人可以帮忙吗(是的,我已经阅读了 sqlalchemy 教程,但仍然存在问题)

我的桌子(部分)

class Character(Base):
    __tablename__ = 'character'
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.id'))
    lock = Column(Boolean)

我在表格中创建了一个空行,只填写了 user_id。

现在这条线工作(1个过滤器)

u_id = 1
x_char = session.query(Character).filter_by(user_id=u_id).first()
y = x_char.id
print y

当我尝试添加第二个过滤器(仍然为空)时,它出错了。 我收到以下错误:AttributeError:'Query' object has no atribute 'id'

x_char = session.query(Character).filter(and_(Character.user_id == u_id, Character.lock == None))
y = x_char.id
print y

请帮助我或指出正确的方向

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    你忘了打电话给.first(),所以你的查询根本没有执行

    x_char = session.query(Character).filter(and_(Character.user_id == u_id, Character.lock == None))
    x_char = x_char.first()
    

    如果此查询没有返回任何内容,x_char 将是 None。要调试为什么查询不返回任何内容,您可以打印生成的 SQL 以帮助您了解 SQLAlchemy 发送到数据库的内容:

    x_char = session.query(Character).filter(and_(Character.user_id == u_id, Character.lock == None))
    print x_char
    

    【讨论】:

    • @HansdeJong:我非常怀疑这一点。 .first() 返回 Query 对象,因此错误至少会因返回的对象类型而不同。
    • @HansdeJong:您看到的错误消息是什么,如果在 Query 对象上的 idAttributeError 完全相同,则您没有正确应用 .first() 调用.如果不同,请分享该错误。
    • 对不起,错误确实改变了。 AttributeError" 'NonType' 对象没有属性 'id' 如果我使用 SQLite Studio 检查,该行的 id 为 1
    • @HansdeJong: 如果.first() 的返回值为None,那么数据库不同意你。使用print x_char 而不是调用xchar.first() 来查看正在执行的SQL 查询。
    • 终于,我明白了。谢谢您的帮助。可以肯定的是,我之前也尝试过 .first() 。我将 lock 更改为 lokk 以为 lock 会被识别为其他东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 2012-05-03
    • 2016-09-17
    相关资源
    最近更新 更多