Вот самый крошечный пример кода, который мне нужен для работы (мы используем mysql в prod, нам нравятся необработанные sql запросы для сложных запросов, потому что аналитики данных могут их читать / изменять / проверять, мы используем sqlite для модульное тестирование)
from typing import List, Any
def test_sqlite_params_demo(self, session):
session.add(build_foo())
session.commit()
query = "select * from foo where id not in :id_list"
result = session.execute(query, {"id_list": [9, 99, 999]})
result_dict: List[Any] = [dict(r) for r in result]
assert len(result_dict) is 1
Вот ошибка, вызванная вышеуказанным:
def do_execute(self, cursor, statement, parameters, context=None):
> cursor.execute(statement, parameters)
E sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "?": syntax error
E [SQL: select * from patient where id not in ?]
E [parameters: ([9, 99, 999],)]
E (Background on this error at: http://sqlalche.me/e/e3q8)
Если я использую кортеж вместо result = session.execute(query, {"id_list": (9, 99, 999)})
, то ошибка будет выглядеть следующим образом:
> cursor.execute(statement, parameters)
E sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "?": syntax error
E [SQL: select * from foo where id not in ?]
E [parameters: ((9, 99, 999),)]
E (Background on this error at: http://sqlalche.me/e/e3q8)
Примечание: эта проблема возникает только при интерполяции списка , а не только одного значения
Я использую SQLAlchemy==1.3.11
в моем файле require.txt
Прямо сейчас Я столкнулся с неприятным выбором между переписыванием сложного кода (в менее желательный формат) перед добавлением теста или добавлением теста, который пропускает / высмеивает ту часть кода, которую я больше всего хочу протестировать. Какой вариант лучше?
Этот вопрос уже задавался раньше, но я не смог его найти. Пожалуйста, укажите мне, если вы знаете, где это:)