sqlAlchemy 模型问题
我遇到了一个情况。我有一个叫做 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"))}
也就是说,数据类型的引用应该是类,而不是字符串。