Sqlalchemy, если таблица не существует

Я написал модуль, который должен создать пустой файл базы данных

def create_database():
    engine = create_engine("sqlite:///myexample.db", echo=True)
    metadata = MetaData(engine)
    metadata.create_all()

Но в другой функции я хочу открыть базу данных myexample.db и создать таблицы для нее, если она еще не имеет этой таблицы.

EG первой, последующей таблицы, которую я создал бы:

Table(Variable_TableName, metadata,
       Column('Id', Integer, primary_key=True, nullable=False),
       Column('Date', Date),
       Column('Volume', Float))

(Поскольку изначально это пустая база данных, в ней не будет никаких таблиц, но впоследствии я могу добавить в нее больше таблиц. То, что я пытаюсь сказать.)

Любые предложения?

Ответ 1

Мне удалось выяснить, что я собирался сделать. Я использовал engine.dialect.has_table(engine, Variable_tableName), чтобы проверить, есть ли в базе данных таблица. Если это не так, то он приступит к созданию таблицы в базе данных.

Пример кода:

engine = create_engine("sqlite:///myexample.db")  # Access the DB Engine
if not engine.dialect.has_table(engine, Variable_tableName):  # If table don't exist, Create.
    metadata = MetaData(engine)
    # Create a table with the appropriate Columns
    Table(Variable_tableName, metadata,
          Column('Id', Integer, primary_key=True, nullable=False), 
          Column('Date', Date), Column('Country', String),
          Column('Brand', String), Column('Price', Float),
          )
    # Implement the creation
    metadata.create_all()

Кажется, это дает мне то, что я ищу.

Ответ 2

Обратите внимание, что в документации Baseametadata говорится о create_all:

Условно по умолчанию, не будет пытаться воссоздать таблицы уже присутствует в целевой базе данных.

И если вы видите, что create_all принимает следующие аргументы: create_all (self, bind = None, tables = None, checkfirst = True) и в соответствии с документацией:

По умолчанию True, не создавать CREATE для таблиц, уже присутствующих в целевая база данных.

Так что, если я правильно понимаю ваш вопрос, вы можете просто пропустить условие.