context : я использую flask-sqlalchemy с MySQL и без ORM-отображения.Обычно я использую:
# in the init method
_db = SqlAlchemy(app)
#... somewhere in my code ...
_db.session.execute(query)
Вызов хранимых процедур не поддерживается "из коробки": callproc
не является общим, но специфичным для коннектора mysql.
Для хранимых процедур без параметров можно выполнить запрос, подобный
_db.session.execute(sqlalchemy.text("CALL my_proc(:param)"), param='something')
, как обычно.Все становится более сложным, когда у вас есть out params ...
Один из способов использовать params - получить доступ к базовому соединителю через engine.raw_connection()
.Например:
conn = _db.engine.raw_connection()
# do the call. The actual parameter does not matter, could be ['lala'] as well
results = conn.cursor().callproc('my_proc_with_one_out_param', [0])
conn.close() # commit
print(results) # will print (<out param result>)
Это хорошо, так как мы можем получить доступ к параметру out, НО это соединение не управляется сеансом фляги .Это означает, что оно не будет зафиксировано / прервано, как с другими управляемыми запросами ... (проблематично, только если ваша процедура имеет побочный эффект).
Наконец я закончил тем, что сделал:
# do the call and store the result in a local mysql variabl
# the name does not matter, as long as it is prefixed by @
_db.session.execute('CALL my_proc_with_one_out_param(@out)')
# do another query to get back the result
result = _db.session.execute('SELECT @out').fetchone()
result
будет кортежем с одним значением: выходной параметр.Это не идеально, но наименее опасно: если во время сеанса произойдет сбой другого запроса, вызов процедуры также будет прерван (откат).