我如何知道调用create_all()时SQLAlchemy是否必须创建表?

时间:2019-01-09 17:36:53

标签: python sqlalchemy

我想记录在调用create_all()时SQLAlchemy是否必须创建任何数据库表,但是我没有看到关于create_all()返回值的任何文档。我该怎么办?

我尝试使用以下代码建立一个简单的内存数据库,并称为create_all()。将echo设置为true,我可以看到该表已按预期创建,但是myreturn具有NoneType类型。如果我第二次调用create_all(),则不会创建该表,并且myreturn仍然是NoneType。

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
Base = declarative_base()

class User(Base):
    __tablename__ = 'testtable'
    id = Column('id', Integer, primary_key=True)
    name = Column('name', String, unique=True)

engine = create_engine('sqlite:///:memory:', echo=True)
myreturn = Base.metadata.create_all(bind=engine)

是否有一种方法可以识别这些表是由create_all()创建的,还是需要在调用create_all()之前直接在数据库中创建其他逻辑来验证这一点?

1 个答案:

答案 0 :(得分:0)

您可以使用after_create事件。事件处理程序将被传递给名为tables的关键字arg,它是在create_all()方法调用中创建的任何表的集合。

from sqlalchemy import event

@event.listens_for(Base.metadata, 'after_create')
def receive_after_create(target, connection, tables, **kw):
    "listen for the 'after_create' event"
    if tables:
        print('A table was created')
    else:
        print('A table was not created')