[英]Can SQLAlchemy use the existing row on 'duplicate key value violates unique constraint'?
我有这段简化的工作代码,它将两个批次及其所有者插入到我的数据库中。 但是所有者在这两种情况下都是相同的,在进入 for 循环之前我不知道这一点。 所有者有唯一的列,所以我不能两次插入同一个所有者。
from sqlalchemy import Column, DateTime, String, Integer, ForeignKey, Float, UniqueConstraint, Boolean, text
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class Owner(Base):
__tablename__ = 'owner'
__table_args__ = (UniqueConstraint('name', 'email'),)
id = Column(Integer, primary_key=True)
name = Column(String(255), nullable=False)
email = Column(String(255))
class Lot(Base):
__tablename__ = 'lot'
id = Column(Integer, primary_key=True)
name = Column(String(255), nullable=False)
owner_id = Column(Integer, ForeignKey('owner.id'))
owner = relationship(Owner)
engine = create_engine('postgresql://my_name:user@localhost:5432/my_db')
session = sessionmaker()
session.configure(bind=engine)
Base.metadata.create_all(engine)
s = session()
for i in range(2):
owner = Owner(name='John', email="john@john.com")
try_owner = s.query(Owner).filter(Owner.name == owner.name).filter(Owner.email == owner.email)
if try_owner.count() != 0:
owner = try_owner.first()
lot = Lot(name="johns lot " + i, owner=owner)
s.add(lot)
s.commit()
s.close()
我总是需要检查所有者是否退出。 如果我不这样做并且所有者存在,则会引发重复键异常。
我想问一下我是否可以以某种方式跳过 select 查询和 if 条件,只是告诉 SQLAlchemy 不要引发异常,而是使用已插入的找到的行。
我正在寻找一些 SQLAlchemy 内部解决方案,因为我额外的 select 查询在我看来无效,并且在我的实际项目中我使用了更复杂的结构。
万一我将来决定更改属性的所有者,如果 SQLAchemy 为该属性创建新所有者并保留旧所有者,那就太好了。
所以我的梦想代码如下
s = session(on_unique_key_violation_use_the_old_one)
for i in range(2):
owner = Owner(name='John', email="john@john.com")
lot = Lot(name="johns lot " + i, owner=owner)
s.add(lot)
s.commit()
我可以做这样的事情吗? 当我开始使用 SQLAlchemy 时,我希望它足够聪明,请注意此类问题。
谢谢你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.