Я использую Postgresql с SQLAlchemy, но кажется, что sqlalchemy испытывает проблемы с добавлением строк при использовании подзапросов.
В моем примере я хочу обновить счетчик для определенного тега в таблице.
В SqlAlchemy класс запуска теста будет выглядеть следующим образом:
class TestRun( base ):
__tablename__ = 'test_runs'
id = sqlalchemy.Column( 'id', sqlalchemy.Integer, sqlalchemy.Sequence('user_id_seq'), primary_key=True )
tag = sqlalchemy.Column( 'tag', sqlalchemy.String )
counter = sqlalchemy.Column( 'counter', sqlalchemy.Integer )
Код вставки должен выглядеть следующим образом:
tag = 'sampletag'
counterquery = session.query(sqlalchemy.func.coalesce(sqlalchemy.func.max(TestRun.counter),0) + 1).\
filter(TestRun.tag == tag).\
subquery()
testrun = TestRun()
testrun.tag = tag
testrun.counter = counterquery
session.add( testrun )
session.commit()
Проблема в том,выдает очень интересную ошибку при запуске этого кода, он пытается запустить следующий SQL-запрос:
'INSERT INTO test_runs (id, tag, counter)
VALUES (%(id)s,
%(tag)s,
SELECT coalesce(max(test_runs.counter), %(param_1)s) + %(coalesce_1)s AS anon_1
FROM test_runs
WHERE test_runs.tag = %(tag_1)s)'
{'coalesce_1': 1, 'param_1': 0, 'tag_1': 'mytag', 'tag': 'mytag', 'id': 267L}
Это выглядит разумно, за исключением того, что отсутствует скобка вокруг вызова SELECT.Когда я запускаю SQL-запрос вручную, он выдает мне ту же самую ошибку, что и sqlalchemy, пока я не введу круглые скобки вручную, что все исправит.Похоже на маловероятную ошибку, которую sqlalchemy забудет поставить в круглые скобки, когда это необходимо, поэтому мой вопрос - я пропускаю функцию для правильного использования подзапросов при добавлении строк с использованием sqlalchemy?