这个问题已经困扰我太久了,我在其他问题上找不到任何解决办法。
在SQLAlchemy中,我正在创建一个模式(2个表),它由键链接。当我将数据插入到表中时,会得到一个唯一的约束错误:
(IntegrityError) ERROR: duplicate key violates UNIQUE-CONSTRAINT e_data_pkey
DETAIL: KEY (id)=(2) already exists.
'INSERT INTO e_data (id, iso3, year, value) VALUES (%(id)s, %(iso3)s, %(year)s, %(value)s)'
({'iso3': 'ABW', 'id': 1, 'value': 5.5, 'year': 2009},
{'iso3': 'ZZZ', **'id': 2,** 'value': 9.9, 'year': 1977},
{'iso3': 'ZZY', **'id': 2**, 'value': 9.876, 'year': 1971})显然,该类为列表中的每个实例分配相同的ID。
is不应该由SQLAlchemy自动生成吗?为什么会发生此错误?我从其他来源改编了这个例子,所以它应该很容易实现。
有人看到问题了吗?下面是我使用的代码:
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relation, sessionmaker
Base = declarative_base()
class E_data(Base):
__tablename__ = 'e_data'
id = Column(Integer, ForeignKey('e_indicator.id'), primary_key=True)
iso3 = Column(String(3), nullable=False)
year = Column(Integer)
value = Column(FLOAT)
eind = relation("E_indicator", backref='e_data', lazy=False)
def __init__(self, iso3=None, year=None, value=None):
self.iso3 = iso3
self.year = year
self.value = value
def __repr__(self):
return "E_Data (%r, %r, %r, %r)" % (self.iso3, self.year, self.value, self.eind)
class E_indicator(Base):
__tablename__ = 'e_indicator'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False, unique=True)
def __init__(self, name=None):
self.name = name
def __repr__(self):
return "E_indicator (%r)" % (self.name)
engine = create_engine('postgresql://postgres:password@localhost/world')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
#INSERT INTO DB
Session = sessionmaker(bind=engine)
session = Session()
m1 = E_data("ABW", 2009, 5.5)
m1.eind = E_indicator("GDP_TEST")
d2 = E_indicator("GDP THE OTHER WAY ROUND")
d2.e_data = [E_data("ZZZ", 1977, 9.9), E_data("ZZY", 1971, 9.876)]
#try:
session.add(m1)
session.add(d2)
session.commit()
#except:
#session.rollback()谢谢你的建议。
发布于 2014-03-24 10:27:52
这是因为在id表中将外键列primary key声明为primary key。
只需删除primary_key=True for id列即可。
class E_data(Base):
__tablename__ = 'e_data'
e_data_id = Column(Integer, primary_key=True)
e_indicator_id = Column(Integer, ForeignKey('e_indicator.id'))
iso3.........发布于 2014-03-28 10:15:04
很抱歉,但你们的建议并没有解决我的问题。我唯一能让它工作的方法是指定一个主要连接条件,如下所示:
eind = relation("E_indicator", backref='e_data', primaryjoin="E_indicator.id==E_data.id")这解决了这个问题。我希望这能帮到别人。
干杯,A
发布于 2022-03-09 20:58:39
我的问题是,当应用程序第一次运行时,我插入了4条初始记录。不知怎么的,Postgres重新启动了柜台,我仍然不知道为什么,在我的第五次尝试和以后的每一次尝试之后,它都起作用了。
https://stackoverflow.com/questions/22561019
复制相似问题