#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 justid
. Оба столбцаid
иlanguage_id
образуют первичный ключ. Следовательно, отношения возвращают более одного тега, например, один тег сid
1 на английском и один на испанском.5. Проблема в том, что если я установлю
uselist=True
, я получу ошибкуTypeError: Incompatible collection type: Tag is not list-like
. Так могу ли я это исправить?
Ответ №1:
Как сказал @zvone, отношения tag
и tag1
могут указывать на несколько тегов, потому Tag
что имеют два основных столбца. Вот о чем предупреждающее сообщение: отношения не уникальны.
Поэтому решение состоит либо в том, чтобы удалить эти связи, либо в том, чтобы сделать их уникальными.