美叶设计网站官网,做电商看的网站有哪些内容,app外包公司怎么找,图库下载网站源码python访问PostgreSQL数据库之连接库Psycopg2作者#xff1a;佣工7001由于要在python访问PostgreSQL数据库#xff0c;需要一个符合DB-API的连接库。通过搜索#xff0c;锁定两个候选库#xff1a;一个是py-postgresql#xff0c;一个是Psycopg2。简单的看了一下py-postgr…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(dbnametest userpostgres)# 建立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, abcdef))# 插叙数据并获取结果 cur.execute(SELECT * FROM test;) cur.fetchone()(1, 100, abcdef)# 提交数据改变 conn.commit()# 关闭Cursor对象和连接对象 cur.close() conn.close()下面就要看psycopg是否能完全满足我的需求(-)建立数据库连接psycopg2中建立数据库连接需要使用connect方法方法形式如下psycopg2.connect(dsn or params [, connection_factory] [, async0])返回值是一个Connection对象。1可以使用DSN连接数据库也就是数据源名称字符串例如conn psycopg2.connect(dbnametest userpostgres passwordsecret)2也可以使用命名参数进行连接。conn psycopg2.connect(databasetest, userpostgres, passwordsecret)基本的连接参数有:dbname – 数据库名(仅在DSN中使用有效)database – 数据库名(仅在使用命名参数时可用)user – 连接数据所用的数据库用户名password – 用户的密码host – 数据库所在主机名或IP地址(默认为本机)port – 端口号(默认为5432 )还有其他一些参数请参见PostgreSQL官方文档 list of supported parameters。另外需要注意的是同样的参数也可以通过环境变量的形式传递到客户端库。3使用connection_factory参数可以指定自定义的Connection连接类详情查看官方文档 Connection and cursor factories 。4设置参数async1则会创建一个异步的连接对象。具体参见官方文档Asynchronous support 了解异步的优缺点。(二)创建字典形式的Cursor对象简单的创建Cursor对象十分简单但是这不能满足我的需求。DictCursor这个才是我所需要的也就是在创建Cursor的时候给出参数cursor_factoryimport psycopg2#为了使用DictCursorimport psycopg2.extrascursor conn.cursor(cursor_factorypsycopg2.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: OReilly, date: datetime.date(2005, 11, 18)})