«TypeError: ожидаемая строка или байтовый объект, получена ошибка типа» с запросом SQLAlchemyPython

Программы на Python
Ответить
Anonymous
 «TypeError: ожидаемая строка или байтовый объект, получена ошибка типа» с запросом SQLAlchemy

Сообщение Anonymous »

(Я пытался опубликовать это здесь, кто-то разместил для меня его версию на r/flask, и пытаюсь еще раз здесь, поэтому, пожалуйста, извините за дублирование, если появится оригинал.)
Я пытаюсь изменить приложение Flask/SQLAlchemy с помощью, казалось бы, простого запроса, и оно выдает ошибку, которую я не могу понять. Я пытаюсь получить некоторые записи «автора», чтобы перейти к шаблону. Учитывая значение идентификатора, я объединяю две таблицы в классах Author и Pseudonyms, которые (я думаю) объявлены правильно. Функция выглядит так:
def get_authors(author_id):
authors = Author.query.\
filter(Pseudonyms.author_id == Author.author_id).\
filter(Pseudonyms.pseudonym == author_id)
return authors

В объявлениях таблиц класс Author имеет (помимо прочего, конечно, но я просто идентифицирую то, что здесь показано):
pseudonyms = db.relationship("Pseudonyms")
и класс Pseudonyms имеет (аналогично):
author_id = db.Column(db.Integer, db.ForeignKey('authors.author_id'))
У меня есть несколько похожих запросов с одинаково объявленными таблицами, и все они работают нормально. Однако этот выдает TypeError: ожидаемая строка или объект, похожий на байты, получивший 'type', при этом трассировка стека показывает вторую строку «фильтра» в приведенном выше запросе как самую непосредственную строку ошибки. Но когда я захожу в консольный отладчик, он показывает, что «author_id» — это целое число (подстановка буквального целочисленного значения не влияет на ошибку, кстати), и что «Pseudonyms.pseudonym» также является целочисленным типом. Я просто не знаю, что не так с этой строкой; и я нигде не вижу другого примера этой ошибки «got 'type'», поэтому не знаю, как ее интерпретировать.
Я также пытался переписать это в новом стиле «execute/select/where» вместо запроса/фильтра, но это то же самое. Все, что я пробовал, всегда выдает ошибку «получил тип» во второй строке «фильтра» (или ее эквиваленте). На самом деле я переносю сам запрос из необработанного SQL из связанного приложения, но проблема связана с этой ошибкой типа, а не с неправильным SQL или чем-то еще.
Чего мне не хватает?
Изменить: Как уже упоминалось, я переношу запрос из необработанного SQL в связанное приложение, где этот запрос работает нормально на протяжении десятилетий. Исходный запрос:
query = """SELECT a.author_id, a.author_name
FROM authors a, pseudonyms p
WHERE p.pseudonym = %d
AND p.author_id = a.author_id""" % int(author_id)

Изменить: добавлена ​​полная обратная трассировка (с некоторыми изменениями в путях и т. д.):
Traceback (most recent call last):
File "/path/to/app/python-port/venv/lib/python3.13/site-packages/flask/app.py", line 1536, in __call__
return self.wsgi_app(environ, start_response)
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
File "/path/to/app/python-port/venv/lib/python3.13/site-packages/flask/app.py", line 1514, in wsgi_app
response = self.handle_exception(e)
File "/path/to/app/python-port/venv/lib/python3.13/site-packages/flask/app.py", line 1511, in wsgi_app
response = self.full_dispatch_request()
File "/path/to/app/python-port/venv/lib/python3.13/site-packages/flask/app.py", line 919, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/path/to/app/python-port/venv/lib/python3.13/site-packages/flask/app.py", line 917, in full_dispatch_request
rv = self.dispatch_request()
File "/path/to/app/python-port/venv/lib/python3.13/site-packages/flask/app.py", line 902, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "/path/to/app/python-port/venv/lib/python3.13/site-packages/flask_caching/__init__.py", line 426, in decorated_function
rv = self._call_fn(f, *args, **kwargs)
File "/path/to/app/python-port/venv/lib/python3.13/site-packages/flask_caching/__init__.py", line 185, in _call_fn
return ensure_sync(fn)(*args, **kwargs)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/path/to/app/python-port/app/views.py", line 228, in view_author
real_names=app.models.get_real_names_of_pseud(author),
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "/path/to/app/python-port/app/models.py", line 520, in get_real_names_of_pseud
return get_authors(author.author_id)
File "/path/to/app/python-port/app/models.py", line 477, in get_authors
filter(Pseudonyms.pseudonym == author_id).\
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/path/to/app/python-port/venv/lib/python3.13/site-packages/sqlalchemy/sql/operators.py", line 584, in __eq__
return self.operate(eq, other)
~~~~~~~~~~~~^^^^^^^^^^^
File "/path/to/app/python-port/venv/lib/python3.13/site-packages/sqlalchemy/sql/elements.py", line 1515, in operate
return op(self.comparator, *other, **kwargs) # type: ignore[no-any-return] # noqa: E501
File "/path/to/app/python-port/venv/lib/python3.13/site-packages/sqlalchemy/sql/operators.py", line 584, in __eq__
return self.operate(eq, other)
~~~~~~~~~~~~^^^^^^^^^^^
File "/path/to/app/python-port/venv/lib/python3.13/site-packages/sqlalchemy/sql/type_api.py", line 197, in operate
return op_fn(self.expr, op, *other, **addtl_kw)
File "/path/to/app/python-port/venv/lib/python3.13/site-packages/sqlalchemy/sql/default_comparator.py", line 121, in _boolean_compare
obj = coercions.expect(

File "/path/to/app/python-port/venv/lib/python3.13/site-packages/sqlalchemy/sql/coercions.py", line 395, in expect
resolved = impl._literal_coercion(

File "/path/to/app/python-port/venv/lib/python3.13/site-packages/sqlalchemy/sql/coercions.py", line 803, in _literal_coercion
return expr._bind_param(operator, element, type_=bindparam_type)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/path/to/app/python-port/venv/lib/python3.13/site-packages/sqlalchemy/sql/elements.py", line 4603, in _bind_param
return BindParameter(

File "/path/to/app/python-port/venv/lib/python3.13/site-packages/sqlalchemy/sql/elements.py", line 1978, in __init__
self.key = _anonymous_label.safe_construct(

File "/path/to/app/python-port/venv/lib/python3.13/site-packages/sqlalchemy/sql/elements.py", line 5471, in safe_construct
body = re.sub(r"[%\(\) \$]+", "_", body)
File "/usr/lib/python3.13/re/__init__.py", line 208, in sub
return _compile(pattern, flags).sub(repl, string, count)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
TypeError: expected string or bytes-like object, got 'type'


Подробнее здесь: https://stackoverflow.com/questions/798 ... th-sqlalch
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»