当我在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
为什么使用别名=原始名称?有什么方法可以禁用此行为?
提前谢谢!
答案 0 :(得分:2)
此查询代表的完整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
的方法都通过{{3 }}方法:
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脱离了方程式。