私は新しいアプリケーションを開始し、ORM、特にSQLAlchemyの使用を検討しています。
データベースに列「foo」があり、それをインクリメントしたいとします。ストレートsqliteでは、これは簡単です。
db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')
私はSQLAlchemySQL-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)
これは少し遅いですが、それほど多くはありません。
SQLAlchemyORMアプローチの私の最良の推測は次のとおりです。
# 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()
これは正しいことですが、他の2つのアプローチの50倍弱かかります。これは、すべてのデータを処理する前にメモリに取り込む必要があるためだと思います。
SQLAlchemyのORMを使用して効率的なSQLを生成する方法はありますか?または他のPythonORMを使用していますか?それとも、SQLを手作業で作成することに戻る必要がありますか?