A-A+

python bottle 框架基础教程:操作数据库

2015年05月26日 Python 评论 1 条 阅读 8,331 views 次

python操作mysql数据库MySQLdb模板,操作postgresql则用psycopg2模块

 

安装MySQLdb(用yum安装,好像只能与mysql5.1版本配合使用):

  1. yum install -y MySQL-python

安装完后,可用import MySQLdb来使用

 

下面先简介MySQLdb的各种方法

MySQLdb.connect():连接数据库,主要有以下参数:

host:数据库主机名.默认是用本地主机. 

user:数据库登陆名.默认是当前用户. 

passwd:数据库登陆的秘密.默认为空. 

db:要使用的数据库名.没有默认值. 

port:MySQL服务使用的TCP端口.默认是3306.

charset:数据库编码。

unix_socket:指定mysql的socket路径,如:unix_socket='/var/mysql/mysql.sock'

 

创建连接:

  1. conn = MySQLdb.connect(user='root',passwd='111111',host='localhost',port=3306, unix_socket='/var/mysql/mysql.sock',charset='utf8')

 

释放连接:

释放连接时可以应用Connection类型对象的close方法。一般操作完数据库后,需要关闭连接

  1. conn.close()

Cursor(游标)对象:

执行SQL语句前要获得一个指定连接的Cursor对象,由Cursor对象执行SQL查询并获取结果。

获得Cursor对象的方法

  1. cur = conn.cursor()

 

关闭Cursor:

执行SQL结束后正常要关闭cursor对象

  1. cur.close()

 

查询,插入,更新、删除操作:

Cursor类型提供了execute方法用于执行SQL操作

  1. execute(query [,parameters])

query是一个SQL字符串,parameters是一个序列或映射,返回值是所影响的记录数

 

查询

cur.execute("select user,host from mysql.user)

cur.execute("select * from user where name = %s and age = %s", {'name':'drfdai', 'age'30})

这里和字符串的格式化操作类似,但不管参数是什么类型,都要用'%s'

 

获取结果

获取结果集有三种方法,fetchone、fetchall和fetchmany,返回结果是一个tuple对象,tuple中的每一个元素对应查询结果中的一条记录。

fetchone()返回结果集中的一条记录

fetchall()返回结果集中的所有记录

fetchmany([N])返回结果集中N条记录

 

插入、更新、删除

cur.execute("insert user (name, age) values(%s, %s)", ('drfdai', 20))

更新和删除的操作与更新、删除类似

除了execute,Cursor类还提供了executemany()方法

executemany(query [, parametersequence])

querey是一个查询字符串,parametersequence是一个参数序列。这一序列的每一项都是一个序列或映射象。但executemany只适合插入、更新或删除操作,而不适用于查询操作。

cur.execute("insert user(name, age) values(%s, %s)", (('drf', 31), ('jiang', 21)))

 

提交

mysql现在一般会默认InnoDB作为默认引擎,InnoDB引擎执行插入、更新、删除操作后要进行提交,才会更新数据库,因此需要用commit()提交后,才会生效执行的SQL

cur.commit()

 

回滚

如果在执行事务SQL时,需要回滚的话,就用以下rollback()

rollback()

对以上操作,进行一个简单的函数封装,这样用起来更方便,特别是需要经常读写数据库的时候,省事,以下是我封装好的简单函数:

  1. #!/usr/bin/env python
  2. #coding=utf-8
  3. import MySQLdb
  4. import logging
  5. #定义错误日志路径
  6. error_log = '/'.join((pro_path,'log/task_error.log'))
  7. #定义日志输出格式
  8. logging.basicConfig(level=logging.ERROR,
  9.         format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
  10.         datefmt = '%Y-%m-%d %H:%M:%S',
  11.         filename = error_log,
  12.         filemode = 'a')
  13. #定义数据库参数
  14. db_name = 'task'
  15. db_user = 'root'
  16. db_pass = '111111'
  17. db_ip = 'localhost'
  18. db_port = 3306
  19. def writeDb(sql,db_data=()):
  20.     """
  21.     连接mysql数据库(写),并进行写的操作
  22.     """
  23.     try:
  24.         conn = MySQLdb.connect(db=db_name,user=db_user,passwd=db_pass,host=db_ip,port=int(db_port))
  25.         cursor = conn.cursor()
  26.     except Exception,e:
  27.         print e
  28.         logging.error('数据库连接失败:%s' % e)
  29.         return False
  30.     try:
  31.         cursor.execute(sql,db_data)
  32.         conn.commit()
  33.     except Exception,e:
  34.         conn.rollback()
  35.         logging.error('数据写入失败:%s' % e)
  36.         return False
  37.     finally:
  38.         cursor.close()
  39.         conn.close()
  40.     return True
  41. def readDb(sql,db_data=()):
  42.     """
  43.     连接mysql数据库(从),并进行数据查询
  44.     """
  45.     try:
  46.         conn = MySQLdb.connect(db=db_name,user=db_user,passwd=db_pass,host=db_ip,port=int(db_port))
  47.         cursor = conn.cursor()
  48.     except Exception,e:
  49.         print e
  50.         logging.error('数据库连接失败:%s' % e)
  51.         return False
  52.     try:
  53.         cursor.execute(sql,db_data)
  54.         data = [dict((cursor.description[i][0], value) for i, value in enumerate(row)) for row in cursor.fetchall()]
  55.     except Exception,e:
  56.         logging.error('数据执行失败:%s' % e)
  57.         return False
  58.     finally:
  59.         cursor.close()
  60.         conn.close()
  61.     return data

 

如果数据库连接失败,把错误写入日志,并返回Flase。

writeDb是用来写入数据的,如果写入失败,写会把错误写入服务器日志中,然后返回False,如果成功,返回True。

readDb是用来读取数据的,如果读取失败,写会把错误写入服务器日志中,然后返回False,如果成功,则返回查询到的数据,数据类型是经过处理好的字典格式。

以下是writeDb和readDb使用的方法:

  1. @route('/api/getuser',method="POST")
  2. def getuser():
  3.     sql = "select * from user;"
  4.     userlist = readDb(sql,)
  5.     return json.dumps(userlist)
  6. @route('/adduser',method="POST")
  7. def adduser():
  8.     name = request.forms.get("name")
  9.     age = request.forms.get("age")
  10.     sex = request.forms.get("sex")
  11.     qq = request.forms.get("qq")
  12.     email = request.forms.get("email")
  13.     departmentid = request.forms.get("department")
  14.     if not name or not age or not sex or not qq or not email or not departmentid:
  15.         return '-2'
  16.     sql = """ 
  17.             INSERT INTO  
  18.                 user(name,age,sex,qq,email,departmentid)  
  19.             VALUES(%s,%s,%s,%s,%s,%s) 
  20.         """  
  21.     data = (name,age,sex,qq,email,departmentid)
  22.     result = writeDb(sql,data)
  23.     if result:
  24.         return '0'
  25.     else:
  26.         return '-1'

 

更多的功能,可以查看bottle官网文档或其它教程

官方文档:http://www.bottlepy.org/docs/dev/index.html

SVN请跳转至:python bottle框架(WEB开发、运维开发)教程目录>

这些代码已提交到SVN中,有需要的朋友可在SVN下载

 

 

1 条留言  访客:0 条  博主:0 条   引用: 1 条

来自外部的引用: 1 条

  • python bottle框架(WEB开发、运维开发)教程 | linux系统运维

给我留言

Copyright © linux系统运维 保留所有权利.   Theme  Ality 粤ICP备13023035号-1

用户登录

分享到: