14.3 连接
连接的过程会因为不同的数据库服务器而不同。在这一部分,您将学到如何使用三种不同的数据库模块来连接。请参考您使用的数据库服务器文档以便得到更详细的信息。
在每一个例子中,一旦您连接上了数据库,您就会有一个数据库处理的句柄(通常使用dbh来表示)。这是一个表示连接的类,并且是您访问数据库的主要接口。即使您不是运行Postgre,您也应该能非常容易地用适合您的数据库的代码替换Postgre例子中的连接代码,并取得实际的结果。
14.3.1 PostgreSQL
有几个不同的模块可以实现从Python到PostgreSQL的连接。在这一章中,我将使用psycopg,您可以从http://initd.org/software/initd/psycopg下载。psycopg模块已经被测试过,在多种平台上完全符合DB-API 2.0。
如果您没有PostgreSQL服务器,您可以从www.postgresql.org免费得到。PostgreSQL可以运行几乎所有Python支持的平台,并能提供一个标准的SQL。
psycopg connect()函数带一个字符串,该字符串包含与远程服务器建立连接所有需要的信息。在下面的例子中,是由getdsn()来产生该字符串的:
#!/usr/bin/env python
# Basic connection to PostgreSQL with psycopg - Chapter 14
# connect_psycopg.py
import psycopg
def getdsn(db = None, user = None, passwd = None, host = None):
if user == None:
# Default user to the one they're logged in as
import os, pwd
user = pwd.getpwuid(os.getuid())[0]
if db == None:
# Default to the username.
db = user
dsn = 'dbname=%s user=%s' % (db, user)
if passwd != None:
dsn += ' password=' + passwd
if host != None:
dsn += ' host=' + host
return dsn
dsn = getdsn()
print "Connecting to %s" % dsn
dbh = psycopg.connect(dsn)
print "Connection successful."
dbh.close()
14.3.2 MySQL
对于MySQL,Python的接口是已知的MySQLdb或MySQL-Python。它们可以从http://sourceforge.net/projects/mysql-python下载,并且兼容DB-API 2.0。
如果您还没有MySQL服务器,您可以从www.mysql.org得到。MySQL可以运行在多种平台上,而且它非常重视性能。
和PostgreSQL不同的是,MySQLdb connect()函数可以带各种参数,而不是仅仅一个字符串。其中重要的参数是:
l user。用户名在连接时需要提供。默认为当前登录的用户,这个和前面PostgreSQL的例子一样。
l passwd。该用户的密码。没有默认的。
l db。连接的数据库。没有默认的。
l host。数据库的主机名,如果没有指定,则连接本机器的数据库。
l port。TCP端口号。默认是3306。
下面是一个例子,它连接foo数据库,其他的参数都使用默认值。
#!/usr/bin/env python
# Basic connection to MySQL with mysqldb - Chapter 14
# connect_mysqldb.py
import MySQLdb
print "Connecting..."
dbh = MySQLdb.connect(db = "foo")
print "Connection successful."
dbh.close()
14.3.3 Jython zxJDBC
这个方法在某些方面有点不同。首先,也是最明显的,之所以不同是因为它不需要标准Python解释器。相反,它需要Jython解释器。如果您没有,您可以从www.jython.org下载。
标准的Python解释器是用C语言编写的。而Jython是用Java。这也就意味着它可以运行在任何支持Java平台上。还意味着运行在Jython下Python程序可以访问Java对象、APIs和方法。
Java提供了一个标准的连接数据库方法,称为JDBC。在概念上,JDBC和Python的DB-API类似,但是实际上的接口是完全不同的。zxJDBC模块就是DB-API和JDBC之间的桥梁。它把DB-API的调用转变为相应的JDBC调用,并把结果以DB-API格式返回。
很多不支持Python的商业数据库支持JDBC。所以,您还是可以编写轻便的Python代码来在常规的Python下运行或使用zxJDBC。使用常规DB-API模块的数据库可以被直接支持,其他的可以使用zxJDBC。
在使用zxJDBC之前,您必须调试好JDBC。首先,您必须有一个Java运行环境(JRE)。这个可以从各种卖主那里得到,而它会随着平台的不同而不同。
接下来,您需要确定您的JDBC驱动在Java上可用。很多情况下,您只需要简单地在CLASSPATH中加上一个目录或JAR文件。在不同的时候,默认设置的方法是不同的,通常您可以设置一个叫“CLASSPATH”的环境变量。
最后,您需要知道JDBC驱动模块的Java名称和用户打开连接的参数。在初始化连接时,zxJDBC会把这些值传递给Java。
下面是一个用zxJDBC建立与PostgreSQL连接的例子:
#!/usr/bin/env /jython
# Basic connection through zxJDBC to PostgreSQL - Chapter 14
# connect_zxjdbc.py
from com.ziclix.python.sql import zxJDBC
import os
dbh = zxJDBC.connect('jdbc:postgresql://localhost/foo',
'jgoerzen', None, 'org.postgresql.Driver')
print "Connection successful."
dbh.close()
这个例子会连接本地机器上名为foo的数据库,提供的用户名为jgoerzen,并且不带密码。
如果您运行这个例子失败,而失败的信息是“寻找com.ziclix失败或驱动句柄错误(driver handler)”,就可能是因为您的Jython不包含完整的zxJDBC。您可以通过从www.jython.org下载完整的Jython来解决这个问题。
最后一点需要注意的是,在编写本书时,当前的Jython版本是与Python 2.1对应的。所以,如果您希望可以使用Jython和zxJDBC,就必须使用Python 2.1或以上版本。据说,Jython小组正在努力更新对于Python的兼容性,所以在您阅读这本书的时候,也许已经出现了新的版本。







