Почему SQLAlchemy помечает столбцы в запросе - PullRequest
0 голосов
/ 19 апреля 2019

Когда я делал запрос в SQLAlchemy, я заметил, что в запросах используется ключевое слово AS для каждого столбца. Он устанавливает alias_name = column_name для каждого столбца.

Например, если я запускаю команду print(session.query(DefaultLog)), она возвращает:

Примечание: DefaultLog - это мой табличный объект.

SELECT default_log.id AS default_log_id, default_log.msg AS default_log_msg, default_log.logger_time AS default_log_logger_time, default_log.logger_line AS default_log_logger_line, default_log.logger_filepath AS default_log_logger_filepath, default_log.level AS default_log_level, default_log.logger_name AS default_log_logger_name, default_log.logger_method AS default_log_logger_method, default_log.hostname AS default_log_hostname
FROM default_log

Почему используется псевдоним = оригинальное имя? Есть ли способ, которым я могу отключить это поведение?

Заранее спасибо!

1 Ответ

2 голосов
/ 19 апреля 2019

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 из уравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...