Effiziente Aktualisierung der Datenbank mit SQLAlchemy ORM

Fange ich eine neue Anwendung und suchen bei Verwendung eines ORM-insbesondere, SQLAlchemy.

Sagen, ich habe eine Spalte 'foo' in meiner Datenbank und ich möchte zu erhöhen. In geraden sqlite, das ist einfach:

db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')

Ich herausgefunden, das SQLAlchemy SQL-builder äquivalent:

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)

Dieser ist etwas langsamer, aber es gibt nicht viel in ihm.

Hier ist meine beste Vermutung für eine SQLAlchemy ORM-Ansatz:

# 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()

Dieser macht das richtige, aber es dauert nur weniger als fünfzig mal so lange wie die anderen beiden Ansätze. Ich vermute, dass es ist, weil es hat um die Daten in den Speicher, bevor Sie mit Ihr arbeiten können.

Gibt es eine Möglichkeit zu erzeugen, die effiziente SQL-Verwendung von SQLAlchemy ist ORM? Oder mit einer anderen python ORM? Oder sollte ich gehen Sie einfach zurück zu dem schreiben der SQL von hand?

Ok, ich nehme an, die Antwort ist "das ist nicht etwas, was ORMs gut tun". Oh gut, ich Lebe und Lerne.
Es wurden einige Experimente laufen auf verschiedenen ORMs und wie Sie durchführen unter Last und Zwang. Nicht über einen link griffbereit, aber lesenswert.
Ein weiteres problem mit dem letzten (ORM) Beispiel ist, dass es nicht atomic.

InformationsquelleAutor John Fouhy | 2008-11-07

Schreibe einen Kommentar