我有一张简单的表格:
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']
有没有办法维护第二个主键而不删除第一个主键的自动增量行为?
答案 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