【发布时间】:2015-12-25 01:46:09
【问题描述】:
我们的系统在 Ubuntu、python 3.4、postgres 9.4.x 和 psycopg2 上运行。
我们(将来会)使用模式在 dev、test 和 prod 环境之间进行拆分。我创建了一个方便的方法来创建与我们的数据库的连接。它使用 json 连接配置文件来创建连接字符串。我想将连接配置为使用返回的连接对所有后续查询使用特定模式。我不希望我的查询具有硬编码模式,因为我们应该能够根据我们是处于开发、测试还是生产阶段/环境轻松地在它们之间切换。
目前方便的方法如下:
def connect(conn_config_file = 'Commons/config/conn_commons.json'):
with open(conn_config_file) as config_file:
conn_config = json.load(config_file)
conn = psycopg2.connect(
"dbname='" + conn_config['dbname'] + "' " +
"user='" + conn_config['user'] + "' " +
"host='" + conn_config['host'] + "' " +
"password='" + conn_config['password'] + "' " +
"port=" + conn_config['port'] + " "
)
cur = conn.cursor()
cur.execute("SET search_path TO " + conn_config['schema'])
return conn
只要您给它时间执行 set search_path 查询,它就可以正常工作。不幸的是,如果我执行以下查询的速度太快,则会在未设置 search_path 的情况下发生竞争条件。我试图通过在return conn 之前执行conn.commit() 来强制执行,但是,这会将search_path 重置为默认模式postgres,这样它就不会使用prod。最好在数据库或应用程序层提出建议,但是,我知道我们可能也可以在操作系统级别解决此问题,也欢迎任何有关该方向的建议。
一个示例 json 配置文件如下所示:
{
"dbname": "thedatabase",
"user": "theuser",
"host": "localhost",
"password": "theusers_secret_password",
"port": "6432",
"schema": "prod"
}
非常感谢任何建议。
【问题讨论】:
-
也许在返回之前等待一秒钟?
import time; time.sleep(1) -
我不敢相信我正在这样做,但我会去寻求你的答案。如果您想要积分,您可以将其发布为答案,我会接受。
-
你的意思是,它很不雅吗?是的,只是一种解决方法
-
你能发布一些演示竞态条件的代码吗?鉴于您只有一个连接并且查询是按顺序执行的,因此您发布的代码中不应该存在竞争条件。如果我复制/粘贴您的代码,硬编码我的本地 Postgres 实例的连接参数,然后添加查询
SHOW search_path,SET的结果是可见的。 -
不可能在单个连接中获得竞争条件。顾名思义,它至少需要两个竞争对手。
标签: python postgresql python-3.x schema psycopg2