如何在sqlalchemy中查询表格
我现在知道怎么在一个模型上进行查询了。假设有一个叫做 Question
的模型:
class Question(Base):
__tablename__ = "questions"
id=Column(...)
user_id=Column(...)
...
现在,我可以这样做:
question = Session.query(Question).filter_by(user_id=123).one()
但是,现在我有一个表(不是模型)叫做 questions
:
questions = Table('questions', Base.metadata,
Column(id, ...),
Column(user_id, ...),
....)
我该怎么像对待模型那样查询它呢?
Session.query(questions).filter_by(user_id=123).one()
这样做会报错:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "E:\Python27\lib\site-packages\sqlalchemy-0.6.3-py2.7.egg\sqlalchemy\orm\query.py", line 851, in filter_by
for key, value in kwargs.iteritems()]
File "E:\Python27\lib\site-packages\sqlalchemy-0.6.3-py2.7.egg\sqlalchemy\orm\util.py", line 567, in _entity_descriptor
desc = entity.class_manager[key]
AttributeError: 'NoneType' object has no attribute 'class_manager'
但是:
Session.query(questions).all()
这样是可以的。
那 filter_by
只适用于模型吗?我该如何在表上进行查询呢?
3 个回答
这个回答有点晚了,但之前的回答缺少了一点,就是你可以同时使用Sessions
和Engines
以及Connections
,而且如果你直接定义了sqlalchemy.schema.Table
,你就不需要使用Session。
那么什么时候应该使用Session,什么时候使用Connection呢?
SQLAlchemy的文档对此有这样的说明:
重要的是要注意,当使用SQLAlchemy的ORM时,这些对象[Engines和Connections]通常不会被直接访问;相反,Session对象被用作与数据库的接口。然而,对于那些直接使用文本SQL语句和/或SQL表达式构造的应用程序,而不涉及ORM的高级管理服务,Engine和Connection才是主角。
简单来说:
如果你在使用ORM(也就是说,你为数据模型编写Python类),那么你会使用Session。如果你是直接定义表格,那么你就不需要涉及任何ORM(以及相关的管理服务),可以直接使用Connection。
那么,使用Connection的工作方式是什么样的呢?:
这里有一个简单的例子,改编自关于连接的文档,它也回答了你关于如何查询表格的问题:
from sqlalchemy import create_engine
engine = create_engine('postgresql://user:pw@localhost:5432/mydatabase')
# Assuming questions is a sqlalchemy.schema.Table instance
with engine.begin() as connection:
query = questions.select().where(
questions.c.user_id == 1)
q1 = connection.execute(query).fetch_one()
有关更多信息,请查看sqlalchemy.schema.Table.select
的文档。
你可以通过 Session.query(Base.metadata.tables['myTable']).all()
来查询那些用表构造器创建的表。
我觉得这段代码的意思是:从数据库中查询问题(questions),然后筛选出用户ID为123的问题,并且只取出一条记录。