2010-08-29 16 views
5

मैं एक स्क्लाइट डीबी से सभी रिकॉर्ड्स का चयन करने की कोशिश कर रहा हूं, मेरे पास स्क्लेक्केमी है, प्रत्येक पर लूप है और उस पर एक अपडेट करें। मैं ऐसा इसलिए कर रहा हूं क्योंकि मुझे अपने नाम कॉलम में कभी भी रिकॉर्ड करने की आवश्यकता है।sqlalchemy डेटाबेस तालिका लॉक है

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 

मैं त्रुटि हो रही है::

यहाँ कोड मैं एक साधारण परीक्षण करने के लिए उपयोग कर रहा हूँ है

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

मैं बहुत SQLAlchemy के लिए नया हूँ और मैं नहीं कर रहा हूँ सुनिश्चित करें कि इस त्रुटि का अर्थ क्या है या इसे कैसे ठीक किया जाए। ऐसा लगता है कि यह वास्तव में एक साधारण काम होना चाहिए, इसलिए मुझे पता है कि मैं कुछ गलत कर रहा हूं।

उत्तर

4

SQLite के साथ, आप अभी भी चयन करने के दौरान डेटाबेस को अपडेट नहीं कर सकते हैं। आपको सभी डेटा को समाप्त और स्टोर करने के लिए चुनिंदा क्वेरी को मजबूर करने की आवश्यकता है, फिर अपना लूप करें। मुझे लगता है कि यह काम (untested) करना होगा:

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

एक अन्य विकल्प लिए थोड़ी ज्यादा जटिल एसक्यूएल बयान बनाने के लिए इतना है कि पाश डेटाबेस के अंदर के बजाय अजगर में कार्यान्वित किया जाएगा। यह निश्चित रूप से आपको एक बड़ा प्रदर्शन बढ़ावा देगा।

+0

विकल्प कोई काम नहीं करेगा ... विकल्प दो के साथ कोई और सलाह? असल में मैं बस अपने डीबी के कॉलम में से किसी एक गैर-असीसी पात्रों को हटाने की कोशिश कर रहा हूं। – imns

+0

पुन: "विकल्प एक काम नहीं करेगा" आप चयनित डेटाबेस ऑब्जेक्ट्स से कोई सूची नहीं बना सकते हैं? क्यों नहीं? – hughdbrown

+0

तो मुझे पता है कि यह पार्टी के लिए बहुत देर हो चुकी है, लेकिन यदि भविष्य में लोग इसमें भाग लेते हैं, तो मुझे डीबी तक पहुंचने वाले सभी खुले कंसोल बंद कर दिए गए हैं जो इस मुद्दे को साफ़ करते हैं। – ExperimentsWithCode

संबंधित मुद्दे