基于查询过滤器返回对象(表示数据库中的一行)的SQLAlchemy(ORM)命令是什么?

基于查询过滤器返回对象(表示数据库中的一行)的SQLAlchemy(ORM)命令是什么?,sqlalchemy,Sqlalchemy,当我发出命令sess.query(TestClass).all()时 SQLAlchemy返回我实例化的两个对象(如预期的那样) 代码: query\u result\u 1=sess.query(TestClass).all() 打印(查询结果1) 输出: [,] 当我发出我希望返回基于过滤器的对象的命令时,我得到了SQL命令 代码: query\u result\u 2=sess.query(TestClass.filter)(TestClass.name==“name\u 1”) 输出:

当我发出命令sess.query(TestClass).all()时 SQLAlchemy返回我实例化的两个对象(如预期的那样)

代码: query\u result\u 1=sess.query(TestClass).all() 打印(查询结果1)

输出: [,]

当我发出我希望返回基于过滤器的对象的命令时,我得到了SQL命令

代码: query\u result\u 2=sess.query(TestClass.filter)(TestClass.name==“name\u 1”)

输出: 选择test_table.id作为test_table_id,选择test_table.name作为test_table_name 从测试表 其中test_table.name=

以下是整个脚本:

进口炼金术

from sqlalchemy import create_engine

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy import Column, Integer, String

from sqlalchemy.orm import Session

from sqlalchemy.orm import Query

print('\nsqlalchemy version:  ' + sqlalchemy.__version__)

Base = declarative_base()

class TestClass(Base):
    __tablename__ = 'test_table'
    id = Column(Integer, primary_key=True)
    name = Column(String(20))

    def __init__(self, name):
        self.name = name

engine = create_engine('sqlite:///', echo=False)
Base.metadata.create_all(engine)
sess = Session(engine)

obj_1 = TestClass('name_1')
sess.add(obj_1)
obj_2 = TestClass('name_2')
sess.add(obj_2)
print('\ntest instance creation (before commit):')
print('obj_1.name = %s' % (obj_1.name))
print('obj_2.name = %s' % (obj_2.name))

query_result_1 = sess.query(TestClass).all()
print('\nquery_result_1 (query all before commit):')
print(query_result_1)

# QUESTION:  What's wrong with this statement...'
# or my expectation of what it should produce?
query_result_2 = sess.query(TestClass).filter(TestClass.name=='name_1')
print('\nquery_result_2 (query (filter by name) before commit):')
print('I expected this query to return the TestClass object with name = name_1')
print('instead, I got this:')
print(query_result_2)

sess.commit()

query_result_3 = sess.query(TestClass).all()
print('\nquery_result_3 (query all after commit):')
print(query_result_3)

# QUESTION:  What's wrong with this statement...'
# or my expectation of what it should produce?
query_result_4 = sess.query(TestClass).filter(TestClass.name=='name_1')
print('\nquery_result_4 (query (filter by name) after commit):')
print('I expected this query to return the TestClass object with name = name_1')
print('instead, I got this:')
print(query_result_4)
以下是终端输出:

sqlalchemy版本:1.3.17

测试实例创建(提交前): obj_1.name=name_1 obj_2.name=name_2

查询结果(提交前查询全部):

[,]

查询结果(提交前的查询(按名称筛选):

我希望此查询返回name=name\u 1的TestClass对象 相反,我得到了这个:

选择test_table.id作为test_table_id,选择test_table.name作为test_table_name 从测试表 其中test_table.name=

查询结果(提交后全部查询): [,]

查询结果4(提交后的查询(按名称筛选):

我希望此查询返回name=name\u 1的TestClass对象 相反,我得到了这个:

选择test_table.id作为test_table_id,选择test_table.name作为test_table_name 从测试表 其中test_table.name=

更新

我发现SQLAlchemy实际上是在我发出带有过滤器的查询语句后返回一个对象列表(在本例中,该列表仅包含一个对象):query(class).filter(class.attrbt===\uuuuuuuuux)

好消息是SQLAlchemy(大部分)的运行方式与我预期的一样,我的查询语句没有任何问题。但现在我有一个不同的问题:


为什么SQLAlchemy的输出显示SQL命令来响应query().filter()语句?在响应query().all()语句时,它返回一个对象列表-这是它在响应query().filter()语句时“应该”做的事情(事实上,这就是正在发生的事情)。

您的第一个示例返回一个对象列表,因为您调用了
.all()
来实际执行查询并返回结果

第二个示例打印SQL,因为您已经创建了查询,但还没有执行它
.filter
修改查询,但不执行查询。比较

thing=session.query(Account.filter)(Account.id==1)
打印(打字(东西))#
打印(东西)#选择so62234199.id作为so62234199_id。。。
。。。与

thing=session.query(Account.filter)(Account.id==1.one)()
打印(打字(东西))#

打印(东西)#在ORM教程中。

感谢您对我的问题给出了富有洞察力的答案。