sqlAlchemy 模型问题

5 投票
2 回答
8685 浏览
提问于 2025-04-16 17:27

我遇到了一个情况。我有一个叫做 DataTypes 的类,它的结构是这样的:

class DataType(Base):
    __tablename__ = 'DATA_TYPES'
    id = Column(Integer, primary_key=True)
    type_name = Column(String)
    fk_result_storage = Column(Integer, ForeignKey('DATA_STORAGES.id'))

    parentDataStorage = relationship("DataStorage", backref=backref("DataType",    cascade="all,delete"))

    def __init__(self, name, resultId):
       self.type_name = name
       self.fk_result_storage = resultId

现在这里定义的关系是有效的。但是我有一些特定的数据类型,它们是通过反射动态创建的,也需要进行级联删除。它们是这样创建的:

t = Table('DATA_' + obj.__name__.lower(), *t[:-1], **t[-1])
mapper(obj, t, *args, **kwargs)
model.Base.metadata.create_all(dao.Engine)   

这样做没问题,表格会按需创建。但是现在我想添加一个类似于 DataType 类的关系。所以我尝试了这个:

t = T('DATA_' + obj.__name__.lower(), *t[:-1], **t[-1])
M(obj,t,properties = {'children' : relationship('DataType', backref=backref(obj, cascade="all,delete"))} )   
model.Base.metadata.create_all(dao.Engine)

但是这给了我:

 sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers.  Original exception was: relationship 'children' expects a class or a mapper argument (received: <type 'str'>)

我对 SQLAlchemy 还很陌生。有什么建议吗?

祝好,

Bogdan

2 个回答

0

其实,只要你在使用声明式扩展,使用字符串来引用数据类型是最简单的,因为声明的顺序并不重要。你只需要确保使用同一个 Base 的实例,也就是 declarative_base()

可以参考 这篇帖子

6

SQLAlchemy不是我最擅长的技能,但我觉得这个属性有问题:

properties = {'children' : relationship('DataType', backref=backref(obj, cascade="all,delete"))}

我认为应该是:

properties = {'children' : relationship(DataType, backref=backref(obj, cascade="all,delete"))}

也就是说,数据类型的引用应该是类,而不是字符串。

撰写回答