具有多个主键的SQLAlchemy不会自动设置任何主键

时间:2010-03-10 09:46:22

标签: python database sqlalchemy primary-key

我有一张简单的表格:

class test(Base):
    __tablename__ = 'test'
    id = Column(Integer, primary_key=True)
    title = Column(String)

    def __init__(self, title):
        self.title = title

使用此表时,会自动设置ID。我想添加另一个独特且有效的搜索字段,因此我添加了字段:

id2 = Column(String, primary_key=True)

并更新了构造函数:

def __init__(self, id2, title):
    self.id2 = id2
    self.title = title

现在,不再自动设置id,或者我得到错误:

IntegrityError:(IntegrityError)test.id可能不是NULL u'INSERT INTO test(id2,title)VALUES(?,?)'[u'a',u'b']

有没有办法维护第二个主键而不删除第一个主键的自动增量行为?

1 个答案:

答案 0 :(得分:7)

我这里几乎没有问题

1)手工制作__init__的目的是什么?如果它只是你写的,你可以完全省略构造函数,因为SQLAlchemy机器为所有模型自动生成完全相同的构造函数。虽然如果你采取一些额外的行动,因此必须覆盖__init__,你可能想要调用超级构造函数:

def __init__(self, lalala, *args, **kwargs):
   # do something with lalala here...
   super(test, self).__init__(*args, **kwargs)
   # ...or here

2)一旦你有一个带有primary_key=True的字段,就会得到一个带有复合主键的模型。复合主键不会自动生成,因为这里存在歧义:后续键应该如何与之前的键不同?

我怀疑使用唯一索引列而不使用复合键可以实现您正在尝试的内容:

class test(Base):
    __tablename__ = 'test'
    id = Column(Integer, primary_key=True)
    id2 = Column(String, index=True, unique=True)
    title = Column(String)

    # def __init__(self) is not necessary