python postgresql跨数据库查询_python访问PostgreSQL数据库之连接库Psycopg2

python访问PostgreSQL数据库之连接库Psycopg2

作者:佣工7001

由于要在python访问PostgreSQL数据库,需要一个符合DB-API的连接库。通过搜索,锁定两个候选库:一个是py-postgresql,一个是Psycopg2。简单的看了一下py-postgresql的文档,发现它并非基于DB-api接口的,而是使用postgresql的API,这可不是我想要的,只好排除。剩下就是这个名字很怪异的Psycopg,看了下,它遵循DB-API规范,好了就选它了,下载安装,试用,老规矩,记录下来要点备忘。

一、安装

由于我开发环境在windows下,所以我下载的是window下的一键安装版本,安装过程非常容易没啥可说的。

二、使用

面的简单使用流程是官网的文档中的例子,看上去是这么的熟悉,是个不错的开始。

# 引入psycopg2库

>>> import psycopg2

# 连接到数据库test

>>> conn = psycopg2.connect("dbname=test user=postgres")

# 建立Cursor对象

>>> cur = conn.cursor()

# 执行sql命令:创建一个新表test

>>> cur.execute("CREATE TABLE test (id serial PRIMARY KEY, num integer, data varchar);")

# 传递数据到语句中形参中,让Psycopg处理正确的转换问题(可以避免sql注入)

>>> cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)",

... (100, "abc'def"))

# 插叙数据,并获取结果

>>> cur.execute("SELECT * FROM test;")

>>> cur.fetchone()

(1, 100, "abc'def")

# 提交数据改变

>>> conn.commit()

# 关闭Cursor对象和连接对象

>>> cur.close()

>>> conn.close()

下面就要看psycopg是否能完全满足我的需求:

(-)建立数据库连接psycopg2中建立数据库连接需要使用connect方法,方法形式如下:psycopg2.connect(dsn or params [, connection_factory] [, async=0])

返回值是一个Connection对象。1,可以使用DSN连接数据库,也就是数据源名称字符串,例如conn = psycopg2.connect("dbname=test user=postgres password=secret")2,也可以使用命名参数进行连接。conn = psycopg2.connect(database="test", user="postgres", password="secret")

基本的连接参数有:

dbname – 数据库名(仅在DSN中使用有效)

database – 数据库名(仅在使用命名参数时可用)

user – 连接数据所用的数据库用户名

password – 用户的密码

host – 数据库所在主机名或IP地址(默认为本机)

port – 端口号(默认为5432 )

还有其他一些参数,请参见PostgreSQL官方文档 list of supported parameters。另外需要注意的是,同样的参数也可以通过环境变量的形式传递到客户端库。

3,使用connection_factory参数,可以指定自定义的Connection连接类,详情查看官方文档 Connection and cursor factories 。

4,设置参数async=1,则会创建一个异步的连接对象。具体参见官方文档Asynchronous support 了解异步的优缺点。

(二)创建字典形式的Cursor对象

简单的创建Cursor对象十分简单,但是这不能满足我的需求。DictCursor这个才是我所需要的,也就是在创建Cursor的时候给出参数cursor_factory

import psycopg2

#为了使用DictCursor

import psycopg2.extrascursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)使用过dbapi编程的,这个好处你懂的

(三)使用命名参数传递数据

我的另一个需求就是,执行sql语句时,最好使用命名参数传递数据,幸运的是psycopg2也是支持命名参数的!psycopg中命名参数的形式是:【%(argname)s】,注意在中括号中的内容就是命名参数要求的形式,其中argname是你起的参数名称,其他的百分号小括号以及小括号后面的s,照写就是。

使用命名参数的好处就是,你不用考虑传递数据的顺序,可以使用字典传递数据(注意字典的key,应该等于上面所说的argname):

>>> cur.execute(

... """INSERT INTO some_table (an_int, a_date, another_date, a_string)

... VALUES (%(int)s, %(date)s, %(date)s, %(str)s);""",

... {'int': 10, 'str': "O'Reilly", 'date': datetime.date(2005, 11, 18)})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[LeetCode]160. Intersection of Two Linked Lists

题目: Write a program to find the node at which the intersection of two singly linked lists begins. For example, the following two linked lists: A: a1 → a2↘c1 → c2 → c3↗ B: b1 → b2 → b3 判断两个链表是否相交&#x…

MongoClient类参考文档

(MongoClient类的实例是)一个带有内部连接池的MongoDB客户端。对绝大部分应用来说,都应该有一个MongoClient实例(不知怎翻译)。 下面各种创建实例的方法是等效的,并且全部都通过默认端口连到本地数据库的&…

反序列化对象列表发生异常_通过反序列化漏洞,黑客能做什么呢?

在之前的文章中讲解了一个反序列化的例子,我们已经知道,通过反序列化漏洞,黑客可以调用到Runtime.exec()来进行命令执行。换一句话说,黑客已经能够在服务器上执行任意的命令,这就相当于间接掌控了你的服务器&#xff0…

nodeJS理解

nodejs是一个基于Chrome V8 引擎的JS运行环境,也就是让javascript运行在服务器(server)端, NodeJS使用了一个事件驱动,非阻塞式的I/O模型,使得其轻量又高效。 Nodejs包管理器npm是全球最大的开源生态系统。…

pythonwhile输出每一个余数_Python 基础 - day02-3

Python 基础 - day02-3循环目标程序的三大流程while 循环基本使用break 和 continuewhile 循环嵌套01. 程序的三大流程在程序开发中, 一共有三种流程方式:顺序 -- 从上向下, 顺序执行代码分支 -- 根据条件判断, 决定执行代码的 分支循环 -- 让 特定代码 重复 执行02. while 循环…

Spring MVC表单验证

看登录控制器代码: RequestMapping(methodRequestMethod.POST,path"/login")public void login(Validated UserEntity user,BindingResult result,HttpServletResponse response) throws BindException{if(result.hasErrors()){response.setHeader("…

小程序开发语言python_小程序是用什么语言开发的?5种最佳语言分享

你应该学习哪种编程语言来探索AI的深度?当然,你会需要一个拥有许多优秀机器学习和深度学习库的语言。它还应具有良好的运行时性能,良好的工具支持,大量程序员社区以及健康的支持包生态系统。这仍然留下了很多不错的选择。下面是我…

tcl之内容

转载于:https://www.cnblogs.com/chip/p/5847126.html

自定义hibernate validation注解

效果和优点 先看最后效果: public class UserEntity {Password private String password;Emailprivate String email;} 上面使用了两个自定义的注解来验证password和email,这样做的好处是:一处定义,处处使用,要修改…

《JS权威指南学习总结--9.5 类和类型》

内容要点: 介绍了三种用以检测任意对象的类的技术,instanceof运算符、constructor属性,以及构造函数的名字。 但每种技术都不甚完美,本节总结了鸭式辩型,这种编程哲学更加关注对象可以完成什么工作(它包含什…

js密码强度正则表达式_知道这20个前端正则表达式,能让你做项目时少写1000行甚至一万行

正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑。熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升。正则表达式经常被用于字段或任意字符串的…

MongoDB数据库设计备忘

1、sex存为01还是男女? 存为01主要是为了国际化和节省存储空间。存为01很容易转换成不同语言表示的男女。 2、文件存储方案 MongoDB有GirdFS用来将文件直接保存到数据库,如果使用nginx,可以直接使用http读取GridFS里面的文件。 所以&…

react js 按条数 展开/折叠

//2条const MAX_SHOW_NUM 2;class HotDiscuss extends Component { static propTypes { //验证 repliedCommentList: PropTypes.array, }; constructor(props) { super(props); this.state { //子评论折叠 isCl…

python怎么获取时间_Python:如何从datetime.timedelta对象中获取时间?

在我看来,MySQL中的TIME类型旨在表示时间间隔,就像Python中的datetime.timedelta那样。从您引用的文档中:TIME values may range from -838:59:59 to 838:59:59. The hours part may be so large because the TIME type can be used not only…

腾讯视频客户端导出MP4格式

腾讯视频下载下来之后是.qlv格式,这种格式只能使用客户端播放。感觉挺蛋疼的,Mp4好不容易让各种设备都可以统一播放视频了,这样一搞感觉又倒退了几十年,关键的是,有些资源是腾讯独家的,不装客户端就看不了&…

Java上传文件到MongoDB GirdFS

上传有两种方式,一种是使用UploadFromStream,另外一种是OpenUploadStream方式,这里使用的是第二种方式: public ObjectId save(){GridFSBucket gfsbk GridFSBuckets.create(db, "user_photo");byte[] data "Data…

js后退页面不重新加载_快应用:支持加载单独JS文件的规范思考

当前快应用的项目中,支持加载其它JS文件(通过:require(./foo.js)),然后通过webpack工具处理依赖,最终完成页面JS的构建,其中页面JS包含了引入的所有JS内容;本文讨论的主要是&#xf…

Linux Linux程序练习七

题目&#xff1a;实现两个程序mysignal、mycontrl&#xff0c;mycontrl给mysignal发送SIGINT信号&#xff0c;控制mysignal是否在屏幕打印“hello”字符串。 //捕捉信号#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h>…

python读取每一行文字二十四_python接口自动化(二十四)--unittest断言——中(详解)...

简介上一篇通过简单的案例给小伙伴们介绍了一下unittest断言&#xff0c;这篇我们将通过结合和围绕实际的工作来进行unittest的断言。这里以获取城市天气预报的接口为例&#xff0c;设计了 2 个用例&#xff0c;一个是查询北京的天气&#xff0c;一个是查询南京为例&#xff0c…

spring MVC配置form支持PUT和DELETE方法

REST的关键原则之一就是“使用标准接口”&#xff08;the use of the Uniform Interface&#xff09;&#xff0c;也就是提倡根据不同的语义使用GET, PUT, POST和DELETE方法&#xff0c;而html的form标签只支持两种提交方法&#xff1a;POST和GET&#xff0c;所以&#xff0c;为…