2009-11-19 74 views
0

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

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

  1. 有关声明,“打印行”,我指定我想有输出的每个列名。即“print 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 

回答

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

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

你看过the tutorial吗?

1

丹尼斯和Kylotan给你很好的答案。我只关注第2点。

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

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