代码是sqlahcmey orm tutorial的一步一步副本,除了最后一行,
我打算在查询后删除所有表。但是Base.metadata.drop_all(bind=engine)
上阻止的程序是当时MySQL的状态(取自MySQL Workbench):
如标记的行所示,丢弃表进程因挂起而被挂起
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:zxsaqw21@localhost/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)
答案 0 :(得分:16)
在执行drop_all()之前调用session.close()(或commit()或rollback())。会议仍在进行公开交易。
本教程针对sqlite,它没有激进的表锁定(我假设你的MySQL数据库在这里使用InnoDB)。