基于查询过滤器返回对象(表示数据库中的一行)的SQLAlchemy(ORM)命令是什么?
当我发出命令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= 以下是整个脚本: 进口炼金术基于查询过滤器返回对象(表示数据库中的一行)的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”) 输出:
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教程中。感谢您对我的问题给出了富有洞察力的答案。