我正在尝试建立一个包含几个特定字段的数据库(我无法离开规范(。其中一个字段是名为 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