Mã này là bản sao từng bước từ số orm tutorial của sqlahcmey, ngoại trừ dòng cuối cùng, Tôi định thả tất cả các bảng sau truy vấn. Nhưng chương trình bị chặn trên Base.metadata.drop_all(bind=engine)
, dưới đây là trạng thái của MySQL tại thời điểm đó (lấy từ MySQL Workbench):SQLAlchemy bị chặn khi thả bảng
Như dòng rõ rệt cho thấy, quá trình bảng thả đã bị treo cổ do table metadata lock
, Tôi đề nghị khóa siêu dữ liệu là do result = session.query(User).all()
vì chương trình không chặn nếu dòng đó bị xóa, nhưng tôi vẫn không biết lý do. Vì vậy, câu hỏi của tôi là: Tại sao điều này xảy ra, làm thế nào để tránh chặn
#!/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)
Cảm ơn, tôi hiểu rồi! Có [trang này] (http://dev.mysql.com/doc/refman/5.5/en/metadata-locking.html) giải thích cùng một điều tôi gặp phải không? – Reorx
yep (điền 15 ký tự) – zzzeek