是否可以重命名 SQLAlchemy 声明性基础的元数据属性



我正在尝试建立一个包含几个特定字段的数据库(我无法离开规范(。其中一个字段是名为 metadata 的列,但sqlalchemy阻止了这种情况:

sqlalchemy.exc.InvalidRequestError: Attribute name 'metadata' is reserved for the MetaData instance when using a declarative base class.

有没有像样的解决方法?我是否需要猴子修补declarative_base函数来重命名metadata属性?我在 api 文档中找不到重命名该属性的选项。

下面是一些将因上述错误而失败的示例代码:

#!/usr/bin/env python3.7
from sqlalchemy.ext.declarative import declarative_base, declared_attr
from sqlalchemy import Column, Integer

class CustomBase(object):
    @declared_attr
    def __tablename__(cls):
        return cls.__name__.lower()
DBBase = declarative_base(cls=CustomBase)

class Data(DBBase):
    id = Column(Integer, primary_key=True)
    metadata = Column(Integer)
if __name__ == "__main__":
    print(dir(Data()))

你可以这样使用:

class Data(DBBase):
    id = Column(Integer, primary_key=True)
    # metadata = Column(Integer)
    metadata_ = Column("metadata", Integer)

Column类的构造函数有一个name参数。你可以从 https://docs.sqlalchemy.org/en/13/core/metadata.html#sqlalchemy.schema.Column 找到它

名称字段可以在施工时省略,稍后应用

换句话说,您可以按照自己的意愿写一个名字。

我知道

这是一个老问题,但我最近遇到了同样的问题,并设法找到了解决方案。

对于 SQLAlchemy 2.0+,您只需在模型声明之后声明该列:

class Data(DBBase):
    id = Column(Integer, primary_key=True)
Data.metadata = Column(Integer)

文档: https://docs.sqlalchemy.org/en/20/orm/declarative_tables.html#appending-additional-columns-to-an-existing-declarative-mapped-class

最新更新