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

Nic*_*eet 8 python postgresql sqlalchemy

我正在尝试建立一个包含一些特定字段的数据库(并且我无法摆脱规范)。其中一个字段是名为 的列metadata,但sqlalchemy会阻止这种情况:

sqlalchemy.exc.InvalidRequestError: Attribute name 'metadata' is reserved for the MetaData instance when using a declarative base class.
Run Code Online (Sandbox Code Playgroud)

有一个合适的解决方法吗?我是否需要对declarative_base函数进行 Monkeypatch 来重命名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()))

Run Code Online (Sandbox Code Playgroud)

Spi*_*Lee 7

你可以这样使用:

class Data(DBBase):
    id = Column(Integer, primary_key=True)
    # metadata = Column(Integer)
    metadata_ = Column("metadata", Integer)
Run Code Online (Sandbox Code Playgroud)

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

名称字段可以在构造时省略并在以后应用

换句话说,你本来可以写一个你想要的名字。