【问题标题】:SQLAlchemy, postgres inherit model which have more than one primary key columnSQLAlchemy,postgres 继承具有多个主键列的模型
【发布时间】:2015-09-24 12:37:57
【问题描述】:

使用SQLAlchemy,我想继承一个具有多个主键的模型,例如:

from sqlalchemy import (Column, Integer, create_engine, ForeignKey,
                        ForeignKeyConstraint, UniqueConstraint)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.declarative import declared_attr


#engine = create_engine('sqlite:///memory')
engine = create_engine('postgres:///memory')
Base = declarative_base()


class Test(Base):
    __tablename__ = 'test'
    id = Column(Integer, primary_key=True)
    id2 = Column(Integer, primary_key=True)


class Test2(Test):
    __tablename__ = 'test2'
    id = Column(Integer, ForeignKey('test.id'), primary_key=True)
    id2 = Column(Integer, ForeignKey('test.id2'), primary_key=True)

    @declared_attr
    def __table_args__(cls):
        return (
            UniqueConstraint(cls.id, cls.id2),
            ForeignKeyConstraint([cls.id, cls.id2], 
                                 [Test.id, Test.id2]),
        )

    @declared_attr
    def __mapper_args__(cls):
        return {
            'inherit_condition': (cls.id == Test.id and cls.id2 == Test.id2),
        }


Base.metadata.create_all(engine)

继承只使用一个主键列,这不是我的用例。我有两个字符串主键列,我使用SQLAlchemy 的多态模式。我没有写我所有的代码,不管有没有多态配置,问题都是一样的。

此代码适用于sqlite,但不适用于postgres__table_args__ 在这里没用,我错过了什么?

问候

【问题讨论】:

    标签: postgresql python-3.x sqlalchemy


    【解决方案1】:

    我发现,column中的外键约束必须去掉

    from sqlalchemy import (Column, Integer, create_engine, 
                            ForeignKeyConstraint)
    from sqlalchemy.ext.declarative import declarative_base
    
    
    #engine = create_engine('sqlite:///memory')
    engine = create_engine('postgres:///memory')
    Base = declarative_base()
    
    
    class Test(Base):
        __tablename__ = 'test'
        id = Column(Integer, primary_key=True)
        id2 = Column(Integer, primary_key=True)
    
    
    class Test2(Test):
        __tablename__ = 'test2'
        # No foreign key here
        id = Column(Integer, primary_key=True)
        id2 = Column(Integer, primary_key=True)
    
        __table_args__ = (
            # this constraints must be the alone to Test model
            ForeignKeyConstraint([id, id2], [Test.id, Test.id2]),
        )
    
    
    Base.metadata.create_all(engine)
    

    【讨论】:

      猜你喜欢
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 2015-04-26
      • 1970-01-01
      • 2019-01-09
      相关资源
      最近更新 更多