【发布时间】:2010-09-21 05:11:31
【问题描述】:
我正在启动一个新的应用程序并考虑使用 ORM——尤其是 SQLAlchemy。
假设我的数据库中有一个列“foo”,我想增加它。在直接的 sqlite 中,这很容易:
db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')
我找到了等效的 SQLAlchemy SQL-builder:
engine = sqlalchemy.create_engine('sqlite:///mydata.sqlitedb')
md = sqlalchemy.MetaData(engine)
table = sqlalchemy.Table('stuff', md, autoload=True)
upd = table.update(values={table.c.foo:table.c.foo+1})
engine.execute(upd)
这会稍微慢一些,但内容不多。
这是我对 SQLAlchemy ORM 方法的最佳猜测:
# snip definition of Stuff class made using declarative_base
# snip creation of session object
for c in session.query(Stuff):
c.foo = c.foo + 1
session.flush()
session.commit()
这样做是正确的,但它需要的时间是其他两种方法的不到 50 倍。我想那是因为它必须先将所有数据带入内存才能使用它。
有没有什么方法可以使用 SQLAlchemy 的 ORM 生成高效的 SQL?或者使用任何其他python ORM?还是我应该回去手动编写 SQL?
【问题讨论】:
-
好吧,我假设答案是“这不是 ORM 做得好的”。那好吧;我生活和学习。
-
已经有一些实验在不同的 ORM 上运行,以及它们在负载和胁迫下的表现。手边没有链接,但值得一读。
-
最后一个(ORM)示例存在的另一个问题是它不是atomic。
标签: python orm sqlalchemy