小编典典

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

sql

是否可以在表的架构或模型的类定义中为(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”中,除了浪费存储空间之外,还使数据库写操作更加复杂。

阅读 229

收藏
2021-04-22

共1个答案

小编典典

这是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):
    ...

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

2021-04-22