Я пытаюсь автоматизировать создание/удаление базы данных моего приложения с помощью SQLAlchemy. Я создал модели, и запросы через ORM работают без проблем. Однако, когда я хочу стереть и воссоздать базу данных с нуля, Base.metadata.drop_all(engine) запускается, но ничего не возвращает, когда я пытаюсь устранить неполадки через консоль Python. Он также фактически не удаляет какие-либо объекты в моем хранилище данных. Я также проверил, что у учетной записи пользователя есть привилегия DROP.
Когда я запускаю Base.metadata.sorted_tables, я получаю список таблиц, соответствующих моделям. Я также попытался запустить цикл for для sorted_tables и выполнить перетаскивание для каждой таблицы, но получил сообщение об ошибке, в котором говорилось, что таблица не существует.
Мой полный репозиторий кода можно найти по адресу: https://github.com/OpenDataAlex/process_tracker_python/tree/master/process_tracker Модели находятся в каталоге models/, а код создания движка — в data_store.py.
Я скопировал то, что я считаю важным, но после многих часов чтения документов и попыток решить эту проблему все сливается воедино x.x.
# The engine creation code
engine = create_engine(data_store_type + '://' + data_store_username + ':' + data_store_password
+ '@' + data_store_host + '/' + data_store_name)
session = sessionmaker(bind=engine)
session = session(expire_on_commit=False)
session.execute("SET search_path TO %s" % data_store_name)
# The drop code, from data_store.py DataStore().initialize_data_store()
self.logger.warn('ALERT - DATA STORE TO BE OVERWRITTEN - ALL DATA WILL BE LOST')
Base.metadata.drop_all(self.engine)
Да собственно ничего не удаляется. Я также проверил, что пользователь, подключающийся к базе данных, может удалять объекты через клиент jdbc/SQL.
Проблема оказалась в том, что, поскольку я использовал postgresql, общедоступная схема использовалась по умолчанию, потому что я не определил схему в моделях таблиц. Как только это было сделано, и схема была также добавлена к любым столбцам ForeignKey, drop_all и create_all работали, как описано в документации.
В качестве примера, вот что в итоге получилось:
class MyTable(Base):
__tablename__ = "my_table"
__table_args__ = {"schema": "my_schema"}
my_table_fk = Column(Integer, ForeignKey("my_schema.my_other_table.my_other_table_id"))
«Base.metadata.drop_all(engine) работает, но ничего не возвращает» — я не думаю, что этот метод должен что-то возвращать. Вы действительно проверяли базу данных, чтобы увидеть, не существуют ли больше таблицы?