10/09/2006

使用python进行数据库模块封装

import MySQLdb
class db:
#构造函数,其中连接了数据库
def __init__(self , host , user , passwd):
try
print "Open the Database"
self.conn = MySQLdb.connect(host , user , passwd)
except MySQLdb.OperationalError ,error:
print "Error %d: %s" % (error[0] , error[1])

#关闭数据库
def db_close(self):
self.conn.close()
print "close the database"

#使用数据库
def db_use(self , name):
str = "use " + name
result = self.db_execute_SQL(str)
return result

#查询数据库
def db_select(self , name , *arg):
str = "SELECT * FROM " + name + self.__str_join__(" " , arg)
result = self.db_execute_SQL(str)
return result

#向数据库添加数据
def db_insert(self , name , *value ):
str = "INSERT INTO " + name + " VALUES (" + self.__str_join__("," , value) + ")"
result = self.db_execute_SQL(str)
return result

#删除数据库中的数据
def db_delete(self , name , ID ):
str = "DELETE FROM " + name + " WHERE id = " + ID
result = self.db_execute_SQL(str)
return result

#修改数据库中的记录
def db_update(self , name , id , *arg):
str = "UPDATE " + name + " SET " + self.__str_join__("," , arg) + " WHERE id = " + id
result = self.db_execute_SQL(str)
return result

#向数据库中添加表
def db_create_table(self , name , *arg):
str = "CREATE TABLE " + name + "(" + self.__str_join__("," , arg) + ")"
result = self.db_execute_SQL(str)
return result

#删除数据库中的表
def db_drop_table(self , name):
str = "DROP TABLE " + name
result = self.db_execute_SQL(str)
return result

#修改数据库中的表
def db_alter_table(self , name , type , arg):
TYPE = ("ADD" , "DROP" , "RENAME")
if type in TYPE:
str = "ALTER TABLE " + name + " " + type + " " + arg
result = self.db_execute_SQL(str)
else:
print "You have an error in your SQL syntax;"
return False
return result

#查看表的结构
def db_describe(self , name):
str = "DESCRIBE " + name
result = self.db_execute_SQL(str)
return result

#执行SQL
def db_execute_SQL(self , str):
cursor = self.conn.cursor()
try:
print str
cursor.execute(str)
self.conn.commit()
allRecords = cursor.fetchall()
except MySQLdb.ProgrammingError , error:
print "You have an error in your SQL syntax;"
return False
except MySQLdb.OperationalError , error:
print "Error %d: %s" % (error[0] , error[1])
return False
if allRecords == ():
return True
else:
return allRecords

#用于连接SQL命令
def __str_join__(self , symbol , arg):
s = " "
for i in arg:
if s != " ":
s += symbol
s += i
return s

#用于测试的模块
if __name__=='__main__':
con = db("localhost" , "root" , "xxxxxxxxxxx")
con.db_execute_SQL("CREATE DATABASE books")
con.db_use("books")
con.db_create_table("books" , "id int" , "Title CHAR(20)" , "Author CHAR(20)")
con.db_insert("books" , '3' , "'dd'" , '"LeYan"')
con.db_insert("books" , "4" , '"JanusLe"' , '"fff"')
print con.db_select("books")
con.db_delete("books" , "4")
print con.db_select("books")
con.db_update("books" , "3" , 'Author = "NoName"')
print con.db_select("books")
con.db_alter_table("books" , "ADD" , "tttt varchar(20)")
print con.db_describe("books")
con.db_alter_table("books" , "DROP" , "tttt")
print con.db_describe("books")
con.db_close()

==================
MySQLdb的安装
下载MySQLdb,展开之后,运行
python setup.py build
进行编译

这一步可能出现许多问题,常见的有

fatal: library -lmysqlclient_r: not found
这是因为当前平台上没有thread-safe library造成的。
解决办法是,在site.cfg文件中设置:
threadsafe = False

mysql.h: No such file or directory
这是因为找不到mysql.h这个文件,一般来说,文件都存放在mysql安装目录的include目录下。
解决办法是,在site.cfg中指定mysql的路径。

另外需要注意的是,在编译时,一定要保证mysql安装目录中/bin目录下的文件都在PATH中,否则无法编译通过。

接下来执行
python setup.py install
安装完成。

比较诡异的是,有时即使安装完成,在python中执行
import MySQLdb
仍然可能出错:
libmysqlclient.so.12: cannot open shared object file: No such file or directory

遇到这种问题,需要在/usr/lib/下为libmysqlclient.so.12设置一个符号链接(这里假设mysql安装在/usr/local/mysql下)
ln -s /usr/lib/mysql/lib/libmysqlclient.so /usr/lib/libmysqlclient.so.12
再次执行
import MySQLdb
成功。

没有评论: