Как автоматически загрузить таблицу «один к одному» в flask_sqlalchemy с фиксированным столбцом идентификатора и переменным числом столбцов? - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть база данных sql (в настоящее время SQLlite для dev) с элементами и вложениями элементов. Количество столбцов в элементах-вложениях неизвестно и изменяется динамически (эти элементы-элементы создаются с помощью алгоритма кластеризации, который устанавливает количество измерений, на основе которых размерность достигает наивысшей перекрестно проверенной точности).

Таким образом, эта база данных содержит две таблицы, соединенные отношением один к одному: Элементы и их информация Вложения элементов

Model.py определяется следующим образом:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data/items.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
db = SQLAlchemy(app)

class Items(db.Model):
    item_id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(40)) 

    item_embeddings = db.relationship('ItemEmbeddings', backref='items', uselist=False,lazy='dynamic') 
    def __repr__(self):
        return '<Item {}>'.format(self.item_id)

Для вложений элементов I Я пробовал несколько вариантов и остановился на:

class ItemEmbeddings(db.Model):
    item_id = db.Column('item_id', db.Integer, db.ForeignKey('items.item_id'), primary_key=True)

    __table_args__ = {
        'metadata':db.metadata,
        'autoload_with': db.engine
    }

Я также попытался передать 'name', 'schema' и autoload: true (для автозагрузки по умолчанию установлено значение true, если передано with_engine).

Я получаю одну из следующих ошибок:

  File ".../lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py", line 855, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File ".../lib/python3.7/site-packages/sqlalchemy/sql/selectable.py", line 645, in foreign_keys
    return self.foreign_keys
  File ".../lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py", line 855, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File ".../lib/python3.7/site-packages/sqlalchemy/sql/selectable.py", line 643, in foreign_keys
    self._init_collections()
RecursionError: maximum recursion depth exceeded

, если не указать имя схемы / таблицы или метаданные:

    raise exc.NoSuchTableError(table.name)
sqlalchemy.exc.NoSuchTableError:
...