当前位置: 首页 > 面试题库 >

别名化SQLAlchemy模型或基础SQL表中的字段名称

怀浩大
2023-03-14
问题内容

是否可以在表的架构或模型的类定义中为(My)SQL列或SQLAlchemy对象属性添加别名?

例如,给定下表:

Users
---------------------
username | ...

我想要以下表格表示形式:

Users
---------------------
id | username | ...

其中User.id映射到User.username而不重复此数据。

将其嵌入到表模式中将是理想的,但是使用ORM的解决方案就足够了。

class User():
    __tablename__ = 'Users'
    username = Column(STRING, primary_key=True, alias='id')

详细

我的用例是,我要存储来自各个网站的抓取数据。我正在使用我拥有的最佳用户ID为该数据编制索引,该用户ID可能是用户名,数字ID甚至全名。

但是,为了规范化跨表的操作,我希望每个表都有一个“ id”字段,该字段映射到可能的最佳ID。

当然,我有两种选择:

  1. 将选定的ID重命名为“ Users.id”,从而使分析人员失去可读性。
  2. 将所选ID中的数据复制到“ Users.id”中,除了浪费存储空间之外,还使数据库写操作更加复杂。

问题答案:

这是SQLAlchemy
Docs中
描述的一种优雅的解决方案,它可以完全满足您的要求:

from sqlalchemy.orm import synonym
class User():
    __tablename__ = 'Users'
    username = Column(STRING, primary_key=True)
    id = synonym('username')

它按预期方式工作:

>>> john = session.query(User).filter_by(id='John Doe').first()
>>> print([john.id, john.username])
['John Doe', 'John Doe']
>>> john.id is john.username
True

顺便说一句,User该类必须是SQLAlchemydeclarative_base()类的子类:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
    ...

转到文档以获取更多参考。



 类似资料:
  • 本文向大家介绍MySQL中使用表别名与字段别名的基本教程,包括了MySQL中使用表别名与字段别名的基本教程的使用技巧和注意事项,需要的朋友参考一下 MySQL 表别名(Alias) SQL 表别名 在 SQL 语句中,可以为表名称及字段(列)名称指定别名(Alias),别名是 SQL 标准语法,几乎所有的数据库系统都支持。通过关键字 AS 来指定。 表别名语法: 上述 SQL 执行后的效果,给人感

  • 在我们结束本章 Git 基础之前,正好有一个小技巧可以使你的 Git 体验更简单、容易、熟悉:别名。 我们不会在之后的章节中引用到或假定你使用过它们,但是你大概应该知道如何使用它们。 Git 并不会在你输入部分命令时自动推断出你想要的命令。 如果不想每次都输入完整的 Git 命令,可以通过 git config 文件来轻松地为每一个命令设置一个别名。 这里有一些例子你可以试试: $ git con

  • 问题内容: 我想实现以下目标: 假设我用“ …”代替了一个冗长而复杂的 CASE 语句,那么在选择并使用别名时, 我不想重复 它。 请注意,这将返回多行,因此在我的情况下,语句外的/是不好的。 问题答案: 一种工作方式是使用子查询: 为了提高可读性,您还可以使用:

  • 问题内容: 我在Netezza工作,或者您知道的是Analytics(分析)的纯数据-nzsql,但是我认为这是一个ANSI SQL问题。这个问题是如此基本,我什至不知道如何搜索。 这将返回“ SMORK,PLONK,SPROING,SPROING”,也就是说,重用CLUNK别名可以很好地进行查询,但是源表中的列会覆盖PLONK别名。现在,如果我真的想要源表中的列,则可以编写SELECT SMOR

  • 我在QueryDSL中有以下查询: 我正在尝试在主查询的子查询(字段 1 和字段 2)中引用别名字段。不幸的是,我得到这个错误: 我还尝试了以下内容: 但我得到的是相同的错误,只是“AliasedTable”而不是“field1”。 如何从outter select中引用别名字段? 先谢谢你。

  • 问题内容: 我刚刚(昨天)学会了使用“存在”而不是“输入”。 我对此有一些疑问: 1)据我所知,解释是: “这样做更好的原因是,将只返回匹配的值,而不是建立大量可能的结果列表” 。这是否意味着虽然第一个子查询可能返回900个结果,但第二个子查询仅返回1(是或否)? 2)过去,我曾在RDBMS中抱怨:“只能检索前1000行”,第二种方法可以解决该问题吗? 3)第二个子查询中别名的范围是什么?…别名仅