SORU
7 Kasım 2008, Cuma


Verimli bir şekilde güncelleme veritabanı SQLAlchemy ORM kullanarak

Yeni bir uygulama başlıyor ve özellikle ORM ... ile bakıyor, SQLAlchemy ediyorum.

Bir sütun 'foo' benim veritabanı ve bunu artırmak istiyorum. içinde var demek Düz sqlite, bu kolaydır:

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

SQL-builder SQLAlchemy eşdeğer. düşündüm

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)

Bu biraz daha yavaş, ama daha fazlası yok.

İşte SQLAlchemy ORM bir yaklaşım için en iyi tahminim

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

Bu doğru olanı yapar, ama sadece altında elli kat daha uzun diğer iki yaklaşım kadar sürer. Bu iş için önce belleğe tüm verileri getirmek için var çünkü sanırım.

Verimli SQL ... ... SQLAlchemy ORM kullanarak oluşturmak için herhangi bir yolu var mı? Ya da başka bir python ORM kullanarak? Ya da sadece elle SQL yazma geri mi dönelim?

CEVAP
10 Kasım 2008, PAZARTESİ


Bu SQLAlchemy ORM ile birlikte SQL tabakası ile kullanılacak, gizlemek değil. Ama aynı işlem ORM ve düz SQL kullanırken akılda birkaç şey tutmak için var. Temel olarak, bir taraftan, ORM veri değişiklikleri sadece oturumda değişiklikleri sürdüğümde veritabanı vuracaktır. Diğer taraftan, SQL veri işleme ifadeleri oturumunda nesneleri etkilemez.

Eğer diyorsan

for c in session.query(Stuff).all():
    c.foo = c.foo 1
session.commit()

bunu yapacak ne diyor, git getir tüm nesneleri veritabanı, değiştir tüm nesneleri ve o zaman floş değişiklikleri veritabanı, güncelleme satırları birer birer.

Bunun yerine, bunu yapmak gerekir:

session.execute(update(stuff_table, values={stuff_table.c.foo: stuff_table.c.foo   1}))
session.commit()

Bu beklediğiniz gibi bir sorgu olarak çalıştırır, ve en azından varsayılan oturum yapılandırmasını tamamlama oturumdaki tüm verileri doluyor çünkü herhangi bir eski veri sorunları yok.

Neredeyse-serbest 0.5 serisi de güncelleme için bu yöntemi kullanabilirsiniz:

session.query(Stuff).update({Stuff.foo: Stuff.foo   1})
session.commit()

Bu temelde önceki parçacık olarak aynı SQL deyimini çalıştırın, ama aynı zamanda değişen satırları seçin ve oturumda herhangi bir eski veri sona erecek. Eğer güncellemeden sonra herhangi bir oturum veri kullanmadığınız ya da synchronize_session=update deyimi Yanlış ekleyebilirsiniz ve bunu seçin kurtulun.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • case LianLi

    case LianLi

    28 Mayıs 2010
  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • Yo Mama

    Yo Mama

    18 EYLÜL 2005