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如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

MySQL 多表连接操作方法(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)

《MySQL多表连接操作方法(INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLOUTERJOIN)》多表连接是一种将两个或多个表中的数据组合在一起的SQL操作,通过连接,... 目录一、 什么是多表连接?二、 mysql 支持的连接类型三、 多表连接的语法四、实战示例 数据准备五、连接的性

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑