首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将一个ponyorm实体属性与其他几个实体关联起来?

如何将一个ponyorm实体属性与其他几个实体关联起来?
EN

Stack Overflow用户
提问于 2019-04-13 01:57:00
回答 1查看 265关注 0票数 0

我开始使用一个现有的数据库,在这个数据库中,表A的属性foo与多个其他表B.fooC.foo相关。如何在ponyorm中形成这种关系?

数据库的组织方式如下。

代码语言:javascript
运行
复制
from pony import orm
db = orm.Database()

class POI(db.Entity):
    '''Point of interest on a map'''
    name = orm.PrimaryKey(str)
    coordinateID = orm.Optional(('cartesian', 'polar')) # doesn't work ofc

class cartesian(db.Entity):
    coordinateID = orm.Required(POI)
    x = orm.Required(float)
    y = orm.Required(float)

class polar(db.Entity):
    coordinateID = orm.Required(POI)
    r = orm.Required(float)
    phi = orm.Required(float)

当然,x,来自cartesianry,来自polar的phi可以移动到POI,在我使用的数据库中,情况也是一样的。但是这些表在利益相关者(本例中为cartesianpolar )之间进行了划分,而且我也无法更改模式。我不能在模式中拆分coordinateID (但如果python类有不同的属性就更好了)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-13 23:49:32

在PonyORM中,不可能将一个属性与多个entity关联起来,除非这些实体是从相同的基本实体继承的,那么您可以将基本实体指定为属性类型,并将任何继承的实体用作真实类型。

如果您使用不能更改现有模式,则可能无法使用继承,需要指定原始id属性而不是关系:

代码语言:javascript
运行
复制
from pony import orm
db = orm.Database()

class POI(db.Entity):
    _table_ = "table_name"
    name = orm.PrimaryKey(str)
    coordinate_id = orm.Optional(int, column="coordinateID")

class Cartesian(db2.Entity):
    _table_ = "cartesian"
    id = orm.PrimaryKey(int, column="coordinateID")
    x = orm.Required(float)
    y = orm.Required(float)

class Polar(db2.Entity):
    _table_ = "polar"
    id = orm.PrimaryKey(int, column="coordinateID")
    r = orm.Required(float)
    phi = orm.Required(float)

然后,您可以像这样执行查询:

代码语言:javascript
运行
复制
left_join(poi for poi in POI
              for c in Cartesian
              for p in Polar
              if poi.coordinate_id == c.id
                 and poi.coordinate_id = p.id
                 and <some additional conditions>)

请注意,同一查询中使用的所有实体都应来自同一数据库。如果实体属于两个不同的数据库,则不能在同一查询中使用它们。并且需要发出单独的查询:

代码语言:javascript
运行
复制
with db_session:
    poi = POI.get(id=some_id)
    coord = Cartesian.get(id=poi.coordinate_id)
    if coord is None:
        coord = Polar.get(id=poi.coordinate_id)
    <do something with poi and coord>

但是,以SQLite为例,您可以将一个数据库附加到另一个数据库,使它们显示为单个数据库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55657262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档