gpt4 book ai didi

python - SQLAlchemy,防止重复行

转载 作者:太空宇宙 更新时间:2023-11-03 14:05:06 25 4
gpt4 key购买 nike

我想知道是否可以防止向数据库提交重复项。例如假设有一个类如下

class Employee(Base):
id = Column(Integer, primary_key=True)
name = Column(String)

如果我要制作一系列这些元素,

employee1 = Employee(name='bob')
employee2 = Employee(name='bob')

session.add_all([employee1, employee2])
session.commit()

我只想将一行添加到数据库中,employee1employee2 指向内存中的同一个对象(如果可能)。

SQLAlchemy 中是否有实现此功能的功能?或者我是否需要确保以编程方式不存在重复项?

最佳答案

另一种 get_or_create() 解决方案:

from sqlalchemy.orm.exc import NoResultFound
# ...

def get_or_create(self, model, **kwargs):
"""
Usage:
class Employee(Base):
__tablename__ = 'employee'
id = Column(Integer, primary_key=True)
name = Column(String, unique=True)

get_or_create(Employee, name='bob')
"""
instance = get_instance(model, **kwargs)
if instance is None:
instance = create_instance(model, **kwargs)
return instance


def create_instance(model, **kwargs):
"""create instance"""
try:
instance = model(**kwargs)
sess.add(instance)
sess.flush()
except Exception as msg:
mtext = 'model:{}, args:{} => msg:{}'
log.error(mtext.format(model, kwargs, msg))
sess.rollback()
raise(msg)
return instance


def get_instance(self, model, **kwargs):
"""Return first instance found."""
try:
return sess.query(model).filter_by(**kwargs).first()
except NoResultFound:
return

关于python - SQLAlchemy,防止重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44511046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com