SQLAlchemy drop_all не удаляя таблицы - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь автоматизировать создание / удаление базы данных моего приложения с помощью 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.

Я скопировал то, что я считаю релевантными битами, но после многих часов чтения документации и попытки решить эту проблему,все это стирается вместе xx

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

1 Ответ

1 голос
/ 07 июня 2019

Проблема оказалась в том, что из-за того, что я использовал 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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...