分页: 1 / 1

[原创]Python访问PostgreSQL

发表于 : 2007-01-18 19:55
moxien
这几天都在弄Python,总算把自己要的编程平台架起来了。写下来作个记号,以后也许用得着。

系统:Linux-Ubuntu6.10
编程工具:Python2.4+wxPython2.6+Boa Constructor+UliPad
数据库:PostgreSQL
ODBC:pyodbc

Python2.4在安装好Ubuntu时已安装在内,原本想安装Python2.5,但是安装后系统还是会使用2.4的文件,也就懒得再弄,先用着2.4版。

wxPython可以让Python实现窗口界面,自己是懒人一个不怎么喜欢使用命令,懒得去记那一大堆的命令和参数,自己的程序也就不用命令行实现,界面虽然不用太华丽,最起码不用记命令、易懂。

Boa是用来架构界面,不用一行一行的写,又是一个偷懒的办法。但是它的代码编辑器却不怎么好用,看起来不怎么舒服,有的英文字会重叠在一起,也就不想用。

UliPad,国人limodou用Python写的一个编辑器,试用了下感觉很好。就用它来作代码编辑器了。

PostgreSQL,Linux下数据库的选择大多数是Mysql,我之所以选择PostgreSQL是因为感觉它比Mysql的功能较为强些,Mysql毕竟是轻量级的数据库,而自己要处理的数据也不算少。这两者我自己都没用过,所有的了解都是从网络上获得。至于怎样还是要用过才知道。

由于Linux下的资源很多,不同软件、不同版本的实现方法都不一样,初学都很多时候时间就在这里浪费。但是,适应这些,入门后,一切都会顺手多了。

wxPython、Boa Constructor、PostgreSQL这三个软件都可以用Ubuntu的“新立得”查找、安装,我不喜欢在命令状态安装。wxPython是绑定在wxWidgets中,新立得是用python-wxgtk2.6包来安装。

UliPad可以到http://wiki.woodpecker.org.cn/moin/UliPad下载。

东西都收集完成了,可是要Python访问Postgre还有得试。
当初是打算用wxPython的wxODBC类进行操作,后来发觉在Python下自己不知道怎样实现,太笨了没办法。
再从Python的官方网中找下http://www.python.org/doc/topics/database/modules,有一大堆关于数据访问的数据中间件。
试也N欠,走了不少弯路,最后选定了pyodbc+unixODBC。

由于pyodbc不能直接从源安装,只能下载源代码自己安装。不过安装很简单,解压代码后,一堆文件和目录中会有一个setup.PY文件,在终端下输入 python setup.PY install。不过,它需要unixODBC的支持,也就要安装unixODBC(包括开发包),这过在新立得中可以找到。至少,要安装下面三个包odbcinst1debian1、unixodbc、unixodbc-dev。unixodbc-bin,是一个图形界面管理程序,不喜欢命令行也就装上了。
pyodbc可在http://pyodbc.sourceforge.net下载。
成功安装后应在/usr/lib/python2.4/site-packages或相应的Python版本的site-packages目录下生成一个pyodbc.so文件。这样就可以在Python程序中使用import pyodbc导入pyodbc模块功能。

接下来是安装PostgreSQL的ODBC驱动,新立得安装odbc-postgresql。

现在,就可以对ODBC进行设置,让Python通过ODBC访问Postgre。Linux下系统的ODBC的设定值分别保存在/etc/odbc.ini和/etc/odbcinst.ini下。odbc.ini是保存DNS相关资料,odbcinst.ini保存数据库ODBC驱动资料。在这里我没有使用DNS进行链接,而是直接使用链接字符串进行链接。所以我只对ODBC驱动资料odbcinst.ini进行设置。
[PostgreSQL]
Description =PostgreSQL ODBC Driver
Driver = /usr/lib/odbc/psqlodbca.so
Driver64 = /usr/lib
Setup = /etc
Setup64 = /usr/lib
UsageCount = 1
CPTimeout =
CPReuse =
这一段就是PostgreSQL的驱动资料,刚开始我是用unixODBC的ODBCConfig生成的。

设置好后,就用Python来测试下。

import pyodbc as odbc

def OnFileOpenMenu(self, event):
self.edTxt. WriteText(unicode('正在测试iODBC链接...','utf-8'))
cons='DRIVER={PostgreSQL};SERVER=localhost;DATABASE=stock;UID=mu;PWD=yc5423'
try:
conn=odbc.connect(cons)
self.edTxt.WriteText('链接成功!')
cursor=conn.cursor()
cursor.execute("delete from transdetail")
#rows=cursor.execute("insert into transdetail values('000001','2007/1/10 09:25:00',1)")
self.edTxt.WriteText("执行SQL语句成功.")
conn.commit()
except:
self.edTxt.WriteText(unicode('\n链接出错.','utf-8')+cons)
return

上面这一段是使用BOA架构的一个菜单的鼠标单击事件,并把处理的结果在文本框中输出。我没用使用标准的print输出结果,还是因为不喜欢命令行,如果有你使用上面的代码不能通过编译,请见谅。


我试了插入和删除命令都成功了。
要注意的是Postgre中的数据库和表最好不要有大小写,这样会出错,那怕你的命令是正确的,也会说找不到相应的表。不知道是不是我有地方没设置好,真让人郁闷。

发表于 : 2007-05-20 18:39
antonym55
哈哈,谢谢楼主分享

没想到unixODBC和PostgreSQL的文章在Python区,呵呵,

也是用的PostgreSQL 和 unixODBC,

下次用Python也试一下

虽然也装了MySQL 不过没怎么用,基本上没让它启动
(这个仅仅是个人喜好的问题,不是说MySQL不好)

setup 项好像有点小问题,
下面的是我的ASCII版的配置(节选)
[PostgreSQL]
Description = PostgreSQL ODBC Driver
Driver = /usr/lib/odbc/psqlodbca.so
Setup = /usr/lib/odbc/libodbcpsqlS.so
具体可以参考
http://www.debian-administration.org/articles/496

发表于 : 2007-07-01 19:23
forrid
楼主用过其他数据中间件么?比如PyGreSQL什么的?

发表于 : 2007-07-03 20:32
kamael
xie xie!!! hao dong xi...

发表于 : 2007-07-30 21:51
isnull
要注意的是Postgre中的数据库和表最好不要有大小写,这样会出错,那怕你的命令是正确的,也会说找不到相应的表。不知道是不是我有地方没设置好,真让人郁闷。
postgresql中表和数据库名中有大写的时候,表名和数据库名要用引号包围起来。比如:

select * from "ABC"

Re:误人子弟!明明有标准DB-API 2.0驱动包pyPgSQL

发表于 : 2010-11-06 12:23
fuhuizn
ubuntu中安装python-pgsql后参考:
/usr/share/doc/python-pgsql/examples/demo1b.py

windows中应该也有此包

代码: 全选

#!/usr/bin/python
#ident "$Id: demo1b.py,v 1.2 2001/10/18 03:17:08 ballie01 Exp $"
#-----------------------------------------------------------------------+
# demo1b.py - implement the sample program #1 from the PostgreSQL libpq	|
#	      doumentation using the PgSQL (DB-API 2.0 compliant) module|
#-----------------------------------------------------------------------+
import sys
from pyPgSQL import PgSQL

dbname = 'template1'

# Make a connection to the database and check to see if it succeeded.
try:
    cnx = PgSQL.connect(database=dbname)
except PgSQL.Error, msg:
    print "Connection to database '%s' failed" % dbname
    print msg,
    sys.exit()

# Create a Cursor object.  This handles the transaction block and the
# declaration of the database cursor.  

cur = cnx.cursor()

# Fetch instances of pg_database, the system catalog of databases.

try:
    cur.execute("SELECT * FROM pg_database")
except PgSQL.Error, msg:
    print "Select from pg_database failed\n%s" % msg,
    sys.exit()

try:
    res = cur.fetchall()
except StandardError, msg:
    print "Fetch of all instanaces failed\n%s" % msg,
    sys.exit()

# First, print out the attibute names.

fmt = ""

for i in cur.description:
    sys.stdout.write('%-15s' % i[0])
    fmt = fmt + '%-15s'	# build up the format string for use later on.

print '\n'

# Next, print out the instances.

for i in res:
    print fmt % tuple(i)

# Close the cursor

cur.close()

# Commit the transaction

cnx.commit()

# That's all folks!

del cnx, cur, res