(Только) генерировать SQL-код с помощью SQLAlchemy

#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() ?