Query.statement
* * 1004
Полный оператор SELECT, представленный этим Запросом.
К заявлению по умолчанию не будут применены двусмысленные метки
до конструкции, если with_labels (True) не вызывается первым.
Использование этой модели:
class DefaultLog(Base):
id = sa.Column(sa.Integer, primary_key=True)
msg = sa.Column(sa.String(128))
logger_time = sa.Column(sa.DateTime)
logger_line = sa.Column(sa.Integer)
print(session.query(DefaultLog).statement)
показывает:
SELECT defaultlog.id, defaultlog.msg, defaultlog.logger_time, defaultlog.logger_line
FROM defaultlog
print(session.query(DefaultLog).with_labels().statement)
показывает:
SELECT defaultlog.id AS defaultlog_id, defaultlog.msg AS defaultlog_msg, defaultlog.logger_time AS defaultlog_logger_time, defaultlog.logger_line AS defaultlog_logger_line
FROM defaultlog
Вы спросили:
Почему используется псевдоним = оригинальное имя?
С Query.with_labels
документы:
... это обычно используется для устранения неоднозначности столбцов из нескольких таблиц с одинаковыми именами.
Так что, если вы хотите выполнить один запрос, который вызывает несколько таблиц, ничто не остановит те таблицы, имеющие столбцы с одинаковыми именами.
Есть ли способ отключить это поведение?
Также из Query.with_labels
документов:
Когда запрос фактически выдает SQL для загрузки строк, он всегда использует столбец
маркировка.
Все методы, которые извлекают строки (get()
, one()
, one_or_none()
, all()
и итерируют по Query
) по маршруту Query.__iter__()
:
def __iter__(self):
context = self._compile_context()
context.statement.use_labels = True
if self._autoflush and not self._populate_existing:
self.session._autoflush()
return self._execute_and_instances(context)
... где эта строка жестко кодирует использование метки: context.statement.use_labels = True
. Так что он «запекается» и не может быть отключен.
Вы можете выполнить инструкцию без меток:
session.execute(session.query(DefaultLog).statement)
... но это выводит ORM из уравнения.