繁体   English   中英

SQLAlchemy在删除表时被阻止

[英]SQLAlchemy blocked on dropping tables

代码是sqlahcmey的orm教程的逐步复制,除了最后一行,我打算在查询后删除所有表。 但是在Base.metadata.drop_all(bind=engine)上阻止的程序,下面是MySQL的状态(取自MySQL Workbench):

工作台管理员

正如标记的行所示,由于table metadata lock ,drop table进程被挂起,我建议元数据锁定是由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)

在执行drop_all()之前调用session.close()(或commit()或rollback())。 会话仍然是一个开放的交易。

本教程针对sqlite,它没有激进的表锁定(我假设你的MySQL数据库在这里使用InnoDB)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM