#python #orm #sqlalchemy
#python #orm #sqlalchemy
Вопрос:
Могу ли я использовать SQLAlchemy ORM-Mapper только для генерации SQL-кода?
С простыми таблицами я могу использовать код типа
print users_table.select()
print users_table.insert()
print users_table.update()
print users_table.delete()
Но с ORM я нашел способ только для операторов SELECT:
TestUser = User("John", "Doe")
print session.query(User)
Как я могу сгенерировать SQL для ВСТАВКИ / ОБНОВЛЕНИЯ / УДАЛЕНИЯ (без реальных манипуляций с базой данных)?
Спасибо.
Ответ №1:
Возможно, вам нужен основной язык выражений SQLAlchemy вместо ORM?
http://www.sqlalchemy.org/docs/core/index.html
ORM спроектирован так, чтобы быть очень жестко привязанным к данным и, следовательно, на самом деле не быть отделенным от своих сеансов DB. Язык выражений, с другой стороны, может быть напрямую переведен в SQL. (Просто возьмите любой из результирующих объектов и передайте их str()
, и вы получите эквивалентный SQL.)
Ответ №2:
Вы можете получить доступ к табличным объектам для сопоставленного класса с помощью функции sqlalchemy.orm.class_mapper:
users_table = class_mapper(User).mapped_table
users_table.insert(..)
Если вы используете декларативный синтаксис, вы можете сделать это:
users_table = User.__table__
users_table.insert(..)
Ответ №3:
Это просто. Точно так же, как то, что вы делаете, вы можете преобразовать запрос в виде строки
TestUser = User("John", "Doe")
# convert querying object to string
query_stat = str(session.query(User))
print query_stat
И здесь query_stat должен быть оператором запроса SQL.
Комментарии:
1. А что, если вы это сделаете
session.query(MyModel).count()
?