2012-12-14 13 views
7

कोड पिछली पंक्ति, को छोड़कर, चरण 2 -को छोड़कर, एक चरण-दर-चरण प्रतिलिपि है, मैं क्वेरी के बाद सभी तालिकाओं को छोड़ना चाहता था। ,SQLAlchemy टेबल छोड़ने पर अवरुद्ध

workbench admin

चिह्नित लाइन से पता चलता है, ड्रॉप तालिका प्रक्रिया table metadata lock की वजह से फांसी पर लटका दिया गया था: लेकिन कार्यक्रम Base.metadata.drop_all(bind=engine) पर अवरुद्ध, नीचे दिए गए उस समय MySQL की स्थिति (MySQL Workbench से लिया गया) है मेरा सुझाव है कि मेटाडाटा लॉक 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() से बचने के लिए कैसे, इससे पहले कि आप drop_all करना()। सत्र अभी भी एक खुले लेनदेन पर बैठा है।

ट्यूटोरियल स्क्लाइट के खिलाफ है जिसमें आक्रामक टेबल लॉकिंग नहीं है (मुझे लगता है कि आपका MySQL डीबी इनो डीबी का उपयोग कर रहा है)।

+0

धन्यवाद, मुझे मिल गया! क्या [यह पृष्ठ] (http://dev.mysql.com/doc/refman/5.5/en/metadata-locking.html) मुझे वही चीज़ समझा रहा है? – Reorx

+0

हाँ (15 वर्ण भरना) – zzzeek