Flask Таблица SQLAlchemy с PickleType выдает ModuleNotFoundError при изменении имени модуля - PullRequest
0 голосов
/ 06 апреля 2020

Я использую Postgres БД, используя Flask -SQLAlchemy. Одним из моих столбцов в таблице является PickleType, в котором хранится сложный пользовательский объект python.

Проще говоря, модель определяется следующим образом:

class Dash(db.Model):
    id = db.Column(db.INTEGER, primary_key=True)
    binary = db.Column(db.PickleType(), nullable=True)
    ....other columns

В прошлом эта таблица работала очень хорошо для меня, но недавно мне пришлось реорганизовать мою базу кода, которая вызвала Многие имена моих модулей должны быть изменены.

Что находится в PickleType? A python объект из пользовательских классов. Эти классы находятся внутри модулей, имена которых изменились.

Теперь, когда имена модулей изменились, моя таблица Da sh больше не работает.

Например, один из моих модулей имеет изменилось с src на server, и теперь, когда я запускаю простой запрос к таблице, я получаю следующую ошибку:

Traceback (most recent call last):
 File "/opt/project/server/api/db-admin.py", line 101, in <module>
  rebuildModels()
 File "/opt/project/server/api/db-admin.py", line 67, in rebuildModels
  allRecords = Dash.query.all()
 File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/query.py", line 3244, in all
  return list(self)
 File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 101, in instances
  cursor.close()
 File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
  compat.raise_(
 File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 178, in raise_
  raise exception
 File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 81, in instances
  rows = [proc(row) for row in fetch]
 File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 81, in <listcomp>
  rows = [proc(row) for row in fetch]
 File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 577, in _instance
  _populate_full(
 File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 723, in _populate_full
  dict_[key] = getter(row)
 File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/sqltypes.py", line 1690, in process
  return loads(value)
ModuleNotFoundError: No module named 'src'

Я пытался перестроить рассол, думая, что, возможно, ссылки ВНУТРИ рассола устарела, но так как таблица даже не позволяет мне запрашивать какие-либо записи, я вообще не могу обновить соленья.

Я подозреваю, что это может быть связано с устаревшими сценариями миграции?

Я попытался сбросить миграцию следующим образом:

flask db stamp head
flask db migrate
flask db upgrade

... и все они работают успешно, но таблица все еще недоступна.

Единственный вариант, который у меня есть, это сбросить мой стол целиком и создай новый с нуля. Хотя это нормально, пока я нахожусь в разработке, когда я перехожу на работу, мне нужно более жизнеспособное решение, чтобы я не потерял данные, которые в данный момент находятся в таблице.

Что я здесь не так делаю?

ОБНОВЛЕНИЕ: Интересно, что если бы я запрашивал таблицу напрямую с помощью sqlalchemy, а не с таблицей sqlalchemy OBJECT, я фактически мог бы выполнить некоторые запросы.

    from sqlalchemy import create_engine
    engine = create_engine('....my DB path...')
    connection = engine.connect()
    my_query = 'SELECT * FROM dash'
    results = connection.execute(my_query).fetchall()
    print(len(results))

Это работает. Но если бы я запросил объект Dash напрямую, я получил бы ошибку ModuleNotFound.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...