我正在启动一个新的应用程序,并考虑使用 ORM ——特别是 SQLAlchemy。
假设我的数据库中有一列“ foo”,我想要增加它。在笔直的草坪上,这很容易:
db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')
我找到了 SQLAlchemy SQL 构建器的等价物:
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?