Предупреждение: несколько строк, возвращенных с помощью uselist = False для лениво загруженного атрибута ‘Similarity.tag1’

#python #python-3.x #sqlalchemy

#python #python-3.x #sqlalchemy

Вопрос:

Я получаю следующее предупреждение от SQLAlchemy, и мне интересно, в чем проблема:

 venvlibsite-packagessqlalchemyormstrategies.py:911: SAWarning: Multiple rows returned with uselist=False for lazily-loaded attribute 'Similarity.tag1' 
  util.warn(
venvlibsite-packagessqlalchemyormstrategies.py:911: SAWarning: Multiple rows returned with uselist=False for lazily-loaded attribute 'Similarity.tag' 
  util.warn(
 

Мои классы ORM выглядят так:

 class Similarity(db.Model):
    __tablename__ = 'similarities'

    tag_id_1 = db.Column(db.ForeignKey('tags.id'), primary_key=True, nullable=False)
    tag_id_2 = db.Column(db.ForeignKey('tags.id'), primary_key=True, nullable=False, index=True)
    value = db.Column(DOUBLE, nullable=False)

    tag = db.relationship('Tag', primaryjoin='Similarity.tag_id_1 == Tag.id', backref='tag_similarities')
    tag1 = db.relationship('Tag', primaryjoin='Similarity.tag_id_2 == Tag.id', backref='tag_similarities_0')


class Tag(db.Model):
    __tablename__ = 'tags'

    id = db.Column(db.Integer, primary_key=True, nullable=False, autoincrement=True)
    language_id = db.Column(db.ForeignKey('languages.id'), primary_key=True, nullable=False, index=True)
    name = db.Column(db.String(45), nullable=False, index=True)

    language = db.relationship('Language', primaryjoin='Tag.language_id == Language.id', backref='tags')
 

Я использую SQLAlchemy 1.3.22 и Python 3.8. Не могли бы вы, пожалуйста, объяснить, о чем это сообщение и как я могу это исправить?

Комментарии:

1. «Несколько строк, возвращаемых с помощью uselist = False» означает, что вы объявили это отношение равным 1 к 1, но в базе данных найдено больше 1.

2. Но я не устанавливаю use_list=False . И я думаю, что по умолчанию True , верно?

3. Значение по умолчанию uselist — нет True . По умолчанию «определяется автоматически» , говорится в спецификациях.

4. Вы правы. Я думаю, я понял, в чем может быть проблема: первичный ключ Tag is not just id . Оба столбца id и language_id образуют первичный ключ. Следовательно, отношения возвращают более одного тега, например, один тег с id 1 на английском и один на испанском.

5. Проблема в том, что если я установлю uselist=True , я получу ошибку TypeError: Incompatible collection type: Tag is not list-like . Так могу ли я это исправить?

Ответ №1:

Как сказал @zvone, отношения tag и tag1 могут указывать на несколько тегов, потому Tag что имеют два основных столбца. Вот о чем предупреждающее сообщение: отношения не уникальны.

Поэтому решение состоит либо в том, чтобы удалить эти связи, либо в том, чтобы сделать их уникальными.