2012-12-14 26 views
7

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

workbench admin

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) 

Trả lời

14

gọi session.close() (hoặc cam kết(), hoặc rollback()) trước khi bạn làm drop_all(). phiên vẫn đang ngồi trên một giao dịch mở.

hướng dẫn chống lại sqlite không có khóa bảng tích cực (tôi giả định rằng MySQL DB của bạn đang sử dụng InnoDB tại đây).

+0

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

+0

yep (điền 15 ký tự) – zzzeek

Các vấn đề liên quan