SQLAlchemy drop_all не удаляет таблицы

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

«Base.metadata.drop_all(engine) работает, но ничего не возвращает» — я не думаю, что этот метод должен что-то возвращать. Вы действительно проверяли базу данных, чтобы увидеть, не существуют ли больше таблицы?

jwodder 30.05.2019 00:33

Да собственно ничего не удаляется. Я также проверил, что пользователь, подключающийся к базе данных, может удалять объекты через клиент jdbc/SQL.

OpenDataAlex 30.05.2019 00:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
1 669
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема оказалась в том, что, поскольку я использовал 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"))

Другие вопросы по теме