python – 在psycopg2中为连接的所有查询设置模式:在设置search_path时获取竞争条件

本文主要是介绍python – 在psycopg2中为连接的所有查询设置模式:在设置search_path时获取竞争条件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们的系统运行在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的情况下发生竞争条件.我试图在返回conn之前强制执行conn.commit(),但是,这会将search_path重置为默认的架构postgres,以便它不会使用,比如prod.在数据库或应用程序层的建议是可取的,但是,我知道我们可能也可以在操作系统级别解决这个问题,也欢迎在这方面提出任何建议.

示例json配置文件如下所示:

 

{"dbname": "thedatabase","user": "theuser","host": "localhost","password": "theusers_secret_password","port": "6432","schema": "prod"
}

任何建议都非常感谢.

我认为更好的想法是使用像DatabaseCursor这样的东西返回游标,用于执行带有“SET search_path …”而不是连接的查询. 
我的意思是这样的:

 

 

class DatabaseCursor(object):def __init__(self, conn_config_file):with open(conn_config_file) as config_file:     self.conn_config = json.load(config_file)def __enter__(self):self.conn = psycopg2.connect("dbname='" + self.conn_config['dbname'] + "' " + "user='" + self.conn_config['user'] + "' " + "host='" + self.conn_config['host'] + "' " + "password='" + self.conn_config['password'] + "' " + "port=" + self.conn_config['port'] + " " )   self.cur = self.conn.cursor()self.cur.execute("SET search_path TO " + self.conn_config['schema'])return self.curdef __exit__(self, exc_type, exc_val, exc_tb):# some logic to commit/rollbackself.conn.close()

 

with DatabaseCursor('Commons/config/conn_commons.json') as cur:cur.execute("...")

这篇关于python – 在psycopg2中为连接的所有查询设置模式:在设置search_path时获取竞争条件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/443828

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

mtu设置多少网速最快? 路由器MTU设置最佳网速的技巧

《mtu设置多少网速最快?路由器MTU设置最佳网速的技巧》mtu设置多少网速最快?想要通过设置路由器mtu获得最佳网速,该怎么设置呢?下面我们就来看看路由器MTU设置最佳网速的技巧... 答:1500 MTU值指的是在网络传输中数据包的最大值,合理的设置MTU 值可以让网络更快!mtu设置可以优化不同的网

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程