Запрос SQLAlchemy не возвращает значения столбца (sqlalchemy.orm.exc.UnmappedInstanceError: класс ‘builtins.str’ не сопоставлен)

#python #flask #sqlalchemy #flask-sqlalchemy #flask-wtforms

#python #flask #sqlalchemy #flask-sqlalchemy #flask-wtforms

Вопрос:

Я пытаюсь добавить результат запроса SQLAlchemy в список.

Мое приложение содержит следующую модель («Game)» и games_query (используется в качестве QuerySelectField query_factory от FlaskForm). РЕДАКТИРОВАТЬ: также добавлена FlaskForm, поскольку кажется, что проблема связана с самой формой, а не с query_factory .

 class Game(db.Model):
   game_id = db.Column(db.Integer, primary_key=True, nullable=False)
   title = db.Column(db.String, nullable=False, unique=True)
   records = db.relationship('Record', backref='game')

def games_query():
   games_list = []
   for g in Game.query:
      games_list.append(g.title)
      print(g.title)
   return games_list

class ScoreForm(FlaskForm):
    name = StringField('Name', validators=[InputRequired()])
    score = IntegerField('Score', validators=[InputRequired()])
    game = QuerySelectField('Game', query_factory=games_query)
    submit = SubmitField('Submit')
  

games_query возвращает следующую ошибку, несмотря на вывод g.title в консоль, возвращающую допустимые значения (названия игр):

Ошибка sqlalchemy.orm.exc.UnmappedInstanceError: класс ‘builtins.str’ не сопоставлен

РЕДАКТИРОВАТЬ: установка query_factory в качестве функции, возвращающей базовые списки, приводит к отображению той же ошибки.

 def games_query():
    games_list = ["Mario", "Zelda"]
    return games_list
  

Как я могу обойти эту ошибку, чтобы games_query возвращал список названий игр, которые могут быть переданы в качестве опций в поле соответствующей формы?

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

1. Обновил начальный пост, поскольку я понял, что ошибка связана с FlaskForm, а не с query_factory .

Ответ №1:

Я нашел причину ошибки. Решение приведено ниже.

Функция query_factory должна возвращать только полный запрос (не список, а не отдельный столбец запроса):

 def games_query():
    return db.session.query(Game)
  

Код Jinja, связанный с FlaskForm по умолчанию, будет отображать столбец primary_key, если только не будет установлен конкретный столбец в FlaskForm с помощью атрибута get_label:

 class ScoreForm(FlaskForm):
    name = StringField('Name', validators=[InputRequired()])
    score = IntegerField('Score', validators=[InputRequired()])
    game = QuerySelectField('Game', query_factory=games_query, get_label='title')
    submit = SubmitField('Submit')
  

Ответ №2:

 def games_query():
   games_list = []
   for row in Game.query:
      games_list.append(row.__dict__['title'])
      print(row.__dict__['title'])
   return games_list

  

Попробуйте

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

1. Спасибо за помощь, но с вашим решением я получаю точно такое же сообщение об ошибке («Класс ‘builtins.str’ не сопоставлен»).

2. О, у меня тот же код, но выполняется хорошо, проверьте модель и добавьте: tablename = ‘Game’ .