【问题标题】:SQLAlchemy Generic Relationship simple exampleSQLAlchemy 通用关系简单示例
【发布时间】:2013-07-15 07:45:50
【问题描述】:

我知道有人问过类似的问题,但是我真的很难理解通用字段是如何在 SQLAlchemy 中实现的。

我有一个权限类/表,我想包含一个可以与任何模型类型相关的字段。

我查看了示例和这篇博文http://techspot.zzzeek.org/2007/05/29/polymorphic-associations-with-sqlalchemy/

是否可以在没有单独的表的情况下建立通用关系?仅仅通过存储object_type和id?大致如下:

class Permission(AbstractBase):
    user = relationship("User", backref=backref('permissions'))
    permission_type = column(String())
    object = #The object the permission applies to, could be any type.

我想只是一个非常简单的例子会很感激!

另外,值得注意的是我来自 Django 背景!

谢谢

【问题讨论】:

  • “没有另一张桌子”是什么意思?你能更好地定义你的 SQL 模式是什么样的吗?
  • 对不起,我应该让自己更清楚。没有另一个表,我的意思是有一个单独的表来存储通用关系。
  • 这是一篇旧博客文章,其中包含旧模式,但第一个示例“rails 是如何做到的”也是 django 方法 - 它放弃使用传统外键以绕过需要一张额外的桌子。但是为什么仅仅为了保存表而错误地构建架构如此重要?

标签: python database sqlalchemy


【解决方案1】:

一天后有人问了同样的问题,我指出了我们为此类事情提供的三个示例,但我还写了一个新示例,它将(大部分)做与 Django 做的相同的事情(减去那个奇怪的“内容类型”表):sqlalchemy generic foreign key (like in django ORM)

【讨论】:

    【解决方案2】:

    您也可以使用sqlalchemy-utils 包中的generic_relationship

    这是example for their documentation

    from sqlalchemy_utils import generic_relationship
    
    class User(Base):
        __tablename__ = 'user'
        id = sa.Column(sa.Integer, primary_key=True)
    
    class Customer(Base):
        __tablename__ = 'customer'
        id = sa.Column(sa.Integer, primary_key=True)
    
    class Event(Base):
        __tablename__ = 'event'
        id = sa.Column(sa.Integer, primary_key=True)
        object_type = sa.Column(sa.Unicode(255))
        object_id = sa.Column(sa.Integer)
        object = generic_relationship(object_type, object_id)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 2016-08-17
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多