【问题标题】:Select statement with SqlAlchemy使用 SqlAlchemy 选择语句
【发布时间】:2010-12-18 04:28:17
【问题描述】:

是的,非常基本的问题。 我已经使用 declarative_base 成功创建了我的数据库,并且也可以对数据库执行插入操作。我只是有几个关于 SqlAlchemy sql 语句的问题。

我创建了一个名为 Location 的表。
一些问题/问题(见下面的代码):

  1. 对于语句“打印行”,我必须指定要输出的每个列名。即“打印 row.name、row.lat 等”为什么? (否则打印语句输出"<classname.Location at <...>>"

  2. 此外,与数据库交互和执行查询(选择、插入、更新等)的首选方式是什么 - 似乎有很多选项:例如使用 sqlalchemy.orm.select,或engine.text(<sql query>).execute().fetchall(),甚至conn.execute(<select>). 选项都很棒,但现在它们都让我感到困惑。

非常感谢您的提示!

这是我的代码:

from sqlalchemy import create_engine
from sqlalchemy.sql import select
from location_db_setup import *

db_path = "sqlite:////volumes/users/shared/programming/python/web/map.db"
engine = create_engine(db_path, echo= True)
Session = sessionmaker(bind= engine)
session = Session()

session.query(Location).fetchall()
for row in locations:
        print row

【问题讨论】:

    标签: python orm sqlalchemy


    【解决方案1】:
    1. 示例中的代码不完整且有错误。所以这里不可能确定Location 是什么。我假设它是一个映射类,因此您请求的是所有 Location objects 的列表,而不是 rows。当你打印一个对象时,你会得到它的字符串表示。可以通过定义自定义__str__ 方法来更改对象的字符串表示。
    2. 虽然 ORM 是 SQLAlchemy 中最重要的部分,但它并不是唯一的。它还公开了许多与 ORM 不直接相关的功能。当您使用对象时,创建查询的首选方法是相应的会话方法。但有时您需要不绑定到特定会话的可选对象(它们不直接执行,而是在传递给会话方法的表达式中使用)。这就是为什么sqlalchemy.orm 包中有函数的原因。

    【讨论】:

      【解决方案2】:

      使用 ORM 时与数据库交互的首选方式不是使用查询,而是使用与您正在操作的表相对应的对象,通常与会话对象结合使用。 SELECT 查询在某些 ORM 中变为 get() 或 find() 调用,在其他 ORM 中变为 query() 调用。 INSERT 成为创建您想要的类型的新对象(并且可能显式添加它,例如 sqlalchemy 中的 session.add())。 UPDATE 变成编辑这样的对象,而 DELETE 变成删除对象(例如 session.delete() )。 ORM 旨在为您处理将这些操作转换为 SQL 的艰巨工作。

      你读过the tutorial吗?

      【讨论】:

        【解决方案3】:

        丹尼斯和凯洛坦给了你很好的答案。我只关注第 2 点。

        有时取决于您的口味。有时您需要 ORM 无法提供的数据库特定功能,此时您应该使用Session(<sql here>).execute()conn.execute(<sql here>)。另一种情况是当您有一个非常复杂的查询超出您的范围并且您没有找到合适的 ORM 表达式时。

        通常,使用诸如select([...]).where(...Session.query(<Model here>).filter(...(声明性基础)之类的 ORM 功能就足够了。几乎每个 sql 查询都有一个 ORM 等价物。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多