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

标签 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 函数进行 monkeypatch 以重命名 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()))

最佳答案

你可以像这样使用:

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找到它

The name field may be omitted at construction time and applied later

也就是说,你本来可以随便写一个名字。

关于python - 是否可以重命名 SQLAlchemy 声明性基础的元数据属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55461914/

相关文章:

postgresql - 为 Postgresql 打开端口

javascript - sequelize 中的关联未按预期工作

Python fCGI + sqlAlchemy = 脚本中格式错误的 header 。错误 header =FROM 标签 : index. py

python - Flask-Admin 在更新时删除辅助映射

python - 在线程崩溃时自动生成到 STDERR 的完整堆栈跟踪

python - 如何在不删除标题栏的情况下禁用 Tkinter 窗口的移动

python - 在 Python 中将行分组为字典

python - Subprocess.communicate 将换行符打印到标准输出

postgresql - 如何在 PostgreSQL 中将 CASE 语句与 LATERAL JOIN 相结合?

python - pandas 在 csv 上提高 OutOfBoundsDatetime 但不在 sql 上提高 OutOfBoundsDatetime