如何在sqlalchemy中查询表格

34 投票
3 回答
58579 浏览
提问于 2025-04-16 03:35

我现在知道怎么在一个模型上进行查询了。假设有一个叫做 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 个回答

3

这个回答有点晚了,但之前的回答缺少了一点,就是你可以同时使用SessionsEngines以及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的文档。

11

你可以通过 Session.query(Base.metadata.tables['myTable']).all() 来查询那些用表构造器创建的表。

39

我觉得这段代码的意思是:从数据库中查询问题(questions),然后筛选出用户ID为123的问题,并且只取出一条记录。

撰写回答