设为首页 收藏本站
查看: 611|回复: 0

[经验分享] Python 连接Postgresql psycopg2 【转】

[复制链接]

尚未签到

发表于 2015-4-27 11:58:40 | 显示全部楼层 |阅读模式
  原文:http://blog.iyunv.com/dajianshi/article/details/7639022  
  由于要在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)})  


  (四)其他
  psycopg有一个怪癖,执行sql时必须在sql语句末尾加分号,不能省略!不过这个咱可以克服^_^

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-61208-1-1.html 上篇帖子: python学习笔记——字符串 下篇帖子: python 类继承
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表