是的,非常基本的问题。 我已经使用declarative_base成功创建了我的数据库,并且也可以在数据库中执行插入操作。我刚才有一些关于SqlAlchemy sql语句的问题。
我创建了一个名为Location的表 一些问题/问题(见下面的代码):
对于语句“print row”,我必须指定我想要输出的每个列名。即“打印row.name,row.lat等”为什么? (否则print语句输出"<classname.Location at <...>>"
此外,与数据库交互并执行查询(选择,插入,更新等)的首选方式是什么 - 似乎有很多选项:例如,使用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
答案 0 :(得分:2)
Location
这里是什么。我假设它是一个映射类,因此您要求列出所有Location
对象,而不是行。打印对象时,您将获得其字符串表示形式。可以通过定义自定义__str__
方法来更改对象的字符串表示。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等价物。