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 для таблиц, уже присутствующих в целевая база данных.
Так что, если я правильно понимаю ваш вопрос, вы можете просто пропустить условие.