SQLAlchemy和显式锁定

Cad*_*nge 8 python orm sqlalchemy

我有多个进程,可能会在数据库中插入重复的行。这些插入不会很频繁地发生(每小时几次),因此它对性能并不重要。

在进行插入之前,我已经尝试过存在检查,如下所示:

#Assume we're inserting a camera object, that's a valid SQLAlchemy ORM object that inherits from declarative_base...
try:
  stmt = exists().where(Camera.id == camera_id)
  exists_result = session.query(Camera).with_lockmode("update").filter(stmt).first()

  if exists_result is None:
    session.add(Camera(...)) #Lots of parameters, just assume it works
    session.commit()
except IntegrityError as e:
  session.rollback()
Run Code Online (Sandbox Code Playgroud)

exist()遇到的问题是检查不会锁定表,因此,多个进程可能会尝试同时插入同一对象。在这种情况下,一个过程通过插入成功,而其他过程则由于IntegrityError异常而失败。虽然这样做有效,但对我来说感觉并不“干净”。

我真的很想在进行exists()检查之前锁定Camera表。

Ale*_*Vhr 5

也许这可能是您感兴趣的:

https://groups.google.com/forum/?fromgroups=#!topic/sqlalchemy/8WLhbsp2nls

您可以通过直接执行SQL来锁定表。我不确定在Elixir中是什么样,但是在普通SA中会是这样:

 conn = engine.connect()
 conn.execute(“锁定表指针写入”)
 #用conn做东西
 conn.execute(“解锁表”)

  • SELECT..FOR UPDATE 不会锁定整个表,只会锁定与 SELECT 条件匹配的行,这对于 INSERT 尚不存在的行是无用的。您需要使用像“LOCK TABLE”这样的 SQL,但这取决于您使用的数据库。 (4认同)
  • @ AlexVhr,OP对您的链接的困惑是为什么SO不鼓励仅链接的答案。当您引用链接时,请引用相关的上下文,以便他们知道您在说什么。 (3认同)