2010-08-29 27 views
5

Ben sqlalchemy sahip bir sqlite db gelen tüm kayıtları seçmeye çalışıyorum, her biri üzerinde döngü ve üzerinde bir güncelleme yapın. Bunu yapıyorum çünkü adım sütunumda yeniden kayıt yapmam gerekiyor.sqlalchemy veritabanı tablosu kilitlendi

def loadDb(name):  

     sqlite3.connect(name)  
     engine = create_engine('sqlite:///'+dbPath(), echo=False)  
     metadata = MetaData(bind=engine) 

     return metadata 

    db = database("dealers.db") 
    metadata = db.loadDb() 
    dealers = Table('dealers', metadata, autoload=True) 

    dealer = dealers.select().order_by(asc(dealers.c.id)).execute() 

    for d in dealer: 
     u = dealers.update(dealers.c.id==d.id) 
     u.execute(name="hi") 

     break 

Şu hatayı alıyorum: Burada

Ben basit bir test yapmak kullanıyorum kodudur

sqlalchemy.exc.OperationalError: (OperationalError) database table is locked u'UPDATE dealers SET name=? WHERE dealers.id = ?' ('hi', 1) 

Ben sqlalchemy çok yeniyim ben değilim Bu hatanın ne anlama geldiğini veya nasıl düzeltileceğini kesin. Bu gerçekten basit bir görev olmalı gibi görünüyor, bu yüzden yanlış bir şey yapıyorum biliyorum.

cevap

4

SQLite ile, hala yürütmeyi yürütürken veritabanını güncelleştiremezsiniz. Tüm verileri tamamlamak ve saklamak için seçim sorgusunu zorlamanız, ardından döngünüzü gerçekleştirmeniz gerekir. Bu (denenmemiş) iş yapacağını düşünüyorum:

dealer = list(dealers.select().order_by(asc(dealers.c.id)).execute()) 

Diğer bir seçenek döngü veritabanı içinde yerine Python işlenecek şekilde biraz daha karmaşık bir SQL açıklama yapmak olacaktır. Bu kesinlikle size büyük bir performans artışı sağlayacaktır.

+0

Seçenek bir işe yaramaz ... seçenek 2 ile daha fazla öneri? Temel olarak, sadece non-ascii karakterleri db'lerimin sütunlarından birinden kaldırmaya çalışıyorum. – imns

+0

Re: "Seçenek işe yaramaz" Seçili veritabanı nesnelerinden bir liste oluşturamazsınız? Neden olmasın? – hughdbrown

+0

Bu yüzden partiye bu kadar geç olduğunu biliyorum, ancak gelecekte insanlar buna koşarsa, db'ye erişen tüm açık konsolları kapatmayı bu sorunu çözdüm. – ExperimentsWithCode