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

时间:2019-04-01 19:05:09

标签: python postgresql 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 docs中找不到重命名该属性的选项。

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

#!/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()))

1 个答案:

答案 0 :(得分:1)

你可以使用像:

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

找到它 <块引用>

name 字段可以在构建时省略,稍后应用

换句话说,您可以根据自己的喜好写一个名字。