XenoPhage
XenoPhage

Reputation: 33

How do I know whether SQLAlchemy had to create tables when create_all() is called?

I'd like to log whether or not SQLAlchemy has to create any database tables when create_all() is called, however I don't see any documentation on a return value from create_all(). How do I go about this?

I've tried setting up a simple in-memory database using the following code and called create_all(). With echo set to true, I can see that the table is created as expected, but myreturn has a type of NoneType. If I call create_all() a second time, the table isn't created, and myreturn is still 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)

Is there a way to identify whether the tables are created by create_all() or do I need to create additional logic to verify this in the database directly before invoking create_all() ?

Upvotes: 1

Views: 1346

Answers (1)

SuperShoot
SuperShoot

Reputation: 10861

You can use the after_create event. The event handler will be passed a keyword arg called tables which is a collection of any tables that were created within the create_all() method call.

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')

Upvotes: 1

Related Questions