使用SqlAlchemy选择语句

时间:2009-11-19 06:03:23

标签: python orm sqlalchemy

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

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

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

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

  3. 非常感谢您的提示!

    这是我的代码:

    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
    

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

您是否阅读过the tutorial

答案 2 :(得分:1)

Denis和Kylotan给了你很好的答案。我只关注第2点。

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

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