2012-12-14 48 views
7

該代碼是從sqlahcmey的orm tutorial的分步拷貝,除了最後一行, 我打算在查詢後刪除所有表格。但受阻上Base.metadata.drop_all(bind=engine)該程序,下面是MySQL的當時的狀態(從MySQL工作臺截取):SQLAlchemy在丟失表格時被阻止

workbench admin

作爲標記行顯示,刪除表過程由於 table metadata lock上吊,我建議元數據鎖定是由於result = session.query(User).all()引起的,因爲如果該行被刪除,程序沒有被阻止, ,但我仍然不知道原因。所以我的問題是:爲什麼會出現這種情況,如何避免阻塞

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, String 


Base = declarative_base() 


class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(16)) 
    fullname = Column(String(16)) 
    password = Column(String(16)) 

    def __init__(self, name, fullname, password): 
     self.name = name 
     self.fullname = fullname 
     self.password = password 

    def __repr__(self): 
     return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password) 


uri = 'mysql://root:[email protected]/test_sa' 
engine = create_engine(uri, echo=False) 

Base.metadata.create_all(engine) 

Session = sessionmaker(bind=engine) 
session = Session() 

user = User('ed', 'Ed Jones', 'edspassword') 
session.add(user) 
session.commit() 

result = session.query(User).all() 
print len(result) 

Base.metadata.drop_all(bind=engine) 

回答

14

調用Session.close()(或提交()或rollback()),你做drop_all前()。該會議仍處於公開交易中。

該教程是針對沒有積極表鎖定的sqlite(我假設你的MySQL DB在這裏使用InnoDB)。

+0

謝謝,我明白了! [本頁](http://dev.mysql.com/doc/refman/5.5/en/metadata-locking.html)是否解釋了我遇到過的同樣的事情? – Reorx

+0

是的(填滿15個字符) – zzzeek