SQLAlchemy映射问题

0 投票
1 回答
848 浏览
提问于 2025-04-15 21:29

我正在尝试使用sqlalchemy来正确地映射我的数据。需要注意的是,一个统一组基本上就是一组组。也就是说,一个统一组可以对应多个组,但每个组只能对应一个统一组。

下面是我定义的统一组的内容:

 CREATE TABLE `unifiedGroups` (     
    `ugID` INT AUTO_INCREMENT,
    `gID` INT NOT NULL,
    PRIMARY KEY(`ugID`, `gID`),
    KEY( `gID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
;

请注意,每一行都是一个ugID和gID的组合。我事先不知道每个ugID有多少个gID,所以这可能是最合理和简单的方法。

这是我统一组类的定义:

class UnifiedGroup(object):
    """UnifiedProduct behaves very much like a group
    """
    def __init__(self, ugID):
        self.ugID=ugID

        #Added by mapping
        self.groups=False

    def __str__(self):
        return '<%s:%s>' % (self.ugID, ','.join( [g for g in self.groups]))

这些是我的映射表:

tb_groupsInfo = Table( 'groupsInfo', metadata, 
    Column('gID', Integer, primary_key=True), 
    Column('gName', String(128)),
)

tb_unifiedGroups = Table( 'unifiedGroups', metadata, 
    Column('ugID', Integer, primary_key=True), 
    Column('gID', Integer, ForeignKey('groupsInfo.gID')),
)

我的映射器是这样工作的:

mapper( UnifiedGroup, tb_unifiedGroups, properties={
    'groups': relation( Group, backref='unifiedGroup')
})

但是,当我尝试访问groupInstance.unifiedGroup时,我得到了一个空列表[],而当我访问groupInstance.unifiedGroup.groups时,出现了错误: AttributeError: 'InstrumentedList'对象没有'groups'这个属性。

Traceback (most recent call last):
  File "Mapping.py", line 119, in <module>
    print p.group.unifiedGroup.groups
AttributeError: 'InstrumentedList' object has no attribute 'groups'

这是怎么回事呢?

1 个回答

1

如果你想让统一组(unifiedgroups)和组(groups)之间有一种一对多的关系,那么你需要把外键放在组的表里。这样做才有意义,其他方式就不太合理了。

撰写回答