在 Python 中插入之前进行 SQLAlchemy 检查
SQLAlchemy check before insert in Python
我有一个关于如何检查条目是否已经在数据库中的更 proper/efficient 方法的问题 table。
假设我有一个名为 Foo
的 table 具有单一属性和 Name
也是 unique.
如果已经有同名的条目,在插入之前检查的更好方法是什么?我可以想到两种选择:
from sqlalchemy import MetaData, Table, Column, String, \
create_engine
from sqlalchemy.orm import mapper, relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.exc import IntegrityError
Base = declarative_base()
class Foo(Base):
__tablename__ = "foo"
name = Column(String(), primary_key=True)
@staticmethod
def silent_insert1(name):
if not session.query(Foo).filter(Foo.name == name).first():
foo = Foo()
foo.name = name
session.add(foo)
session.commit()
else:
print("already exists 1")
@staticmethod
def silent_insert2(name):
try:
foo = Foo()
foo.name = name
session.add(foo)
session.commit()
except(IntegrityError):
print("already exists 2")
engine = create_engine('sqlite://', echo=True)
Base.metadata.create_all(engine)
session = sessionmaker(engine)()
Foo.silent_insert1(1)
Foo.silent_insert2(1)
在第一个silent_insert1中,当然有竞争条件。第二个似乎更防弹。
哪个更好?是否有更好的方法或推荐的方法来检查这个?
谢谢
你应该把 session.add
放在 try/except
其次,这是一个哲学问题。你不会得到明确的答案。
这两种风格被称为look before you leap (LBYL),这种风格提前使用if语句来判断你是否应该这样做。
第二种风格被称为比许可(EAFP)更容易请求宽恕,这种风格假定它会工作并捕获并处理在规则被打破的事件。作为一般规则 python 程序员倾向于支持 EAFP,但就像任何规则一样,也有很多很多例外情况
我有一个关于如何检查条目是否已经在数据库中的更 proper/efficient 方法的问题 table。
假设我有一个名为 Foo
的 table 具有单一属性和 Name
也是 unique.
如果已经有同名的条目,在插入之前检查的更好方法是什么?我可以想到两种选择:
from sqlalchemy import MetaData, Table, Column, String, \
create_engine
from sqlalchemy.orm import mapper, relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.exc import IntegrityError
Base = declarative_base()
class Foo(Base):
__tablename__ = "foo"
name = Column(String(), primary_key=True)
@staticmethod
def silent_insert1(name):
if not session.query(Foo).filter(Foo.name == name).first():
foo = Foo()
foo.name = name
session.add(foo)
session.commit()
else:
print("already exists 1")
@staticmethod
def silent_insert2(name):
try:
foo = Foo()
foo.name = name
session.add(foo)
session.commit()
except(IntegrityError):
print("already exists 2")
engine = create_engine('sqlite://', echo=True)
Base.metadata.create_all(engine)
session = sessionmaker(engine)()
Foo.silent_insert1(1)
Foo.silent_insert2(1)
在第一个silent_insert1中,当然有竞争条件。第二个似乎更防弹。
哪个更好?是否有更好的方法或推荐的方法来检查这个?
谢谢
你应该把 session.add
放在 try/except
其次,这是一个哲学问题。你不会得到明确的答案。
这两种风格被称为look before you leap (LBYL),这种风格提前使用if语句来判断你是否应该这样做。
第二种风格被称为比许可(EAFP)更容易请求宽恕,这种风格假定它会工作并捕获并处理在规则被打破的事件。作为一般规则 python 程序员倾向于支持 EAFP,但就像任何规则一样,也有很多很多例外情况