muc*_*out 3 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
Run Code Online (Sandbox Code Playgroud)
使用此表时,会自动设置ID.我想添加另一个独特且有效的搜索字段,所以我添加了字段:
id2 = Column(String, primary_key=True)
Run Code Online (Sandbox Code Playgroud)
并更新了构造函数:
def __init__(self, id2, title):
self.id2 = id2
self.title = title
Run Code Online (Sandbox Code Playgroud)
现在,不再自动设置id,或者我得到错误:
IntegrityError:(IntegrityError)test.id可能不是NULL u'INSERT INTO test(id2,title)VALUES(?,?)'[u'a',u'b']
有没有办法维护第二个主键而不删除第一个主键的自动增量行为?
我这里几乎没有问题
1)手工制作的目的是什么__init__?如果它只是你写的,你可以完全省略构造函数,因为SQLAlchemy机器为你的所有模型自动生成完全相同的构造函数.虽然如果你采取一些额外的动作,因此必须覆盖__init__你可能想要调用超级构造函数:
def __init__(self, lalala, *args, **kwargs):
# do something with lalala here...
super(test, self).__init__(*args, **kwargs)
# ...or here
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)