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

cbwuti44  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(88)

我正在尝试用几个特定的字段建立一个数据库(我不能离开规范)。其中一个字段将是一个名为metadata的列,但sqlalchemy阻止了这一点:

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

字符串
有没有一个像样的变通办法?是否需要monkeypatch 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()))

tf7tbtn2

tf7tbtn21#

你可以使用像:

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

字符串
Column类的构造函数有一个name参数。您可以从www.example.com找到它https://docs.sqlalchemy.org/en/13/core/metadata.html#sqlalchemy.schema.Column
name字段可能在构造时被省略,以后再应用
换句话说,你可以写一个你想要的名字。

toe95027

toe950272#

我知道这是一个老问题,但我最近遇到了同样的问题,并设法找到了解决方案。
对于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

相关问题