python操作MySQL数据库增删改查使用MySQLdb
2017-03-15 20:11
656 查看
在操作之前,我们来看一下 python 是怎么连接 MySQL 数据库的。
首先我们需要下载必要的包 mysql-python,下载地址为:
https://sourceforge.net/projects/mysql-python/files/ 安装的过程不在赘述。
欢迎访问我的个人网站:http://www.cjluzzl.cn
安装完成后打开终端,进入 python 环境,输入 import MySQLdb 没有报错证明安装成功。
安装好必要的包我们来介绍一下连接数据库的原理。
首先打开数据库,创建一个 user_table 表
CREATE TABLE `user_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
这里要注意设置存储引擎为 InnoDB,因为这个引擎支持事务。
然后随便添加几条数据。
然后开始测试
运行结果如下
从运行结果可以看出,python是以元组的形式返回的数据库中的记录。执行完execute()影响的行数是9条。
总结一下连接数据库的步骤
connection()创建一个连接对象,connect()函数的参数说明如下:
2. cursor = con.cursor()创建一个游标对象,用于查询和获取结果,cursor的方法有:
测试增删改查操作
对比一下运行前后的数据库状态
运行前: 运行后:
这里特别要注意的是sql语句使用execute()方法执行后,要使用commit()方法提交处理,当事务失败后,要调用rollback()方法进行事务的回滚。注意尽量避免使用不支持事务的存储引擎。
使用python操作数据库模拟银行转账的功能
账户 11 余额为110元
账户 12 余额为10元
执行12 11 100意为账户12转给账户11 100元,则转账失败
转账失败那么11的钱没增加,12的钱也不能少,回到数据的初始状态,这就是事务的回滚。
当账户11转给12账户100元时,可以完成操作,转账成功。回到数据库刷新可以看到11的钱少了100元,12的钱增加了100元。
首先我们需要下载必要的包 mysql-python,下载地址为:
https://sourceforge.net/projects/mysql-python/files/ 安装的过程不在赘述。
欢迎访问我的个人网站:http://www.cjluzzl.cn
安装完成后打开终端,进入 python 环境,输入 import MySQLdb 没有报错证明安装成功。
安装好必要的包我们来介绍一下连接数据库的原理。
首先打开数据库,创建一个 user_table 表
CREATE TABLE `user_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
这里要注意设置存储引擎为 InnoDB,因为这个引擎支持事务。
然后随便添加几条数据。
然后开始测试
import MySQLdb con = MySQLdb.connect(host='127.0.0.1', port = 3306, user = 'root', passwd = '142857', db = 'user', charset='utf8') cursor = con.cursor() sql = 'select * from user_table' cursor.execute(sql) info = cursor.fetchall() for i in info: print i print cursor.rowcount cursor.close() con.close()
运行结果如下
从运行结果可以看出,python是以元组的形式返回的数据库中的记录。执行完execute()影响的行数是9条。
总结一下连接数据库的步骤
connection()创建一个连接对象,connect()函数的参数说明如下:
参数名 | 类型 | 说明 |
host | 字符串 | 服务器地址 |
port | 数字 | 服务器端口号 |
user | 字符串 | 用户名 |
passwd | 字符串 | 密码 |
db | 字符串 | 数据库名称 |
charset | 字符串 | 连接编码 |
参数名 | 说明 |
execute(sql[,args]) | 执行一条SQL语句 |
fetchone() | 取结果集的下一行 |
fetchmany(size) | 取结果集的下几行 |
fetchall() | 获取结果集中剩下的所有行 |
rowcount | 最近一次执行execute返回的数据行数或影响行数 |
commit() | 提交事务 |
rollback() | 回滚事务,恢复数据到修改之前 |
close() | 关闭游标对象 |
import MySQLdb conn = MySQLdb.connect( host = '127.0.0.1', port = 3306, user = 'root', passwd = '142857', db = 'user', charset = 'utf8' ) cursor = conn.cursor() sql_insert = 'insert into user_table(`id`,`name`) values(10,"name10")' sql_update = 'update user_table set `name`="name_07" where id =7' sql_delete = "delete from user_table where id<3 " try: cursor.execute(sql_insert) print cursor.rowcount cursor.execute(sql_update) print cursor.rowcount cursor.execute(sql_delete) print cursor.rowcount conn.commit() except Exception as e: print e conn.rollback() cursor.close() conn.close()
对比一下运行前后的数据库状态
运行前: 运行后:
这里特别要注意的是sql语句使用execute()方法执行后,要使用commit()方法提交处理,当事务失败后,要调用rollback()方法进行事务的回滚。注意尽量避免使用不支持事务的存储引擎。
使用python操作数据库模拟银行转账的功能
import sys import MySQLdb class TransferMoney(): def __init__(self,conn): self.conn = conn def check_acct_available(self, acctid): cursor = self.conn.cursor() try: sql = 'select * from account where acctid=%s' % acctid cursor.execute(sql) print 'check_acct_available:' + sql rs = cursor.fetchall() if len(rs) != 1: raise Exception("账号%s不存在" % acctid) finally: cursor.close() def has_enough_money(self, acctid, money): cursor = self.conn.cursor() try: sql = 'select * from account where acctid=%s and money > %s' % (acctid,money) cursor.execute(sql) print 'has_enough_money:' + sql rs = cursor.fetchall() if len(rs) != 1: raise Exception("账号%s没有足够的钱" % acctid) finally: cursor.close() def reduce_money(self, acctid, money): cursor = self.conn.cursor() try: sql = 'update account set money=money-%s where acctid=%s' % (money,acctid) cursor.execute(sql) print 'reduce_money:' + sql if cursor.rowcount != 1: raise Exception("账号%s减款失败" % acctid) finally: cursor.close() def add_money(self, acctid, money): cursor = self.conn.cursor() try: sql = 'update account set money=money+%s where acctid=%s' % (money,acctid) cursor.execute(sql) print 'add_money:' + sql if cursor.rowcount != 1: raise Exception("账号%s加款失败" % acctid) finally: cursor.close() def transfer(self,source_acctid,target_acctid,money): try: self.check_acct_available(source_acctid) self.check_acct_available(target_acctid) self.has_enough_money(source_acctid,money) self.reduce_money(source_acctid,money) self.add_money(target_acctid,money) self.conn.commit() except Exception as e: self.conn.rollback() raise e if __name__ == "__main__": source_acctid = sys.argv[1] target_acctid = sys.argv[2] money = sys.argv[3] print source_acctid,' ',target_acctid,' ',money conn = MySQLdb.connect(host='127.0.0.1',port = 3306,user = 'root',passwd='142857',db ='user',charset = 'utf8') tr_money = TransferMoney(conn) try: tr_money.transfer(source_acctid,target_acctid,money) except Exception as e: print u'出现问题',e finally: conn.close()
账户 11 余额为110元
账户 12 余额为10元
执行12 11 100意为账户12转给账户11 100元,则转账失败
转账失败那么11的钱没增加,12的钱也不能少,回到数据的初始状态,这就是事务的回滚。
当账户11转给12账户100元时,可以完成操作,转账成功。回到数据库刷新可以看到11的钱少了100元,12的钱增加了100元。
相关文章推荐
- Python自动化(七)使用MySQLdb操作MySQL数据库
- Windows下安装MySQLdb, Python操作MySQL数据库的增删改查
- python下使用MySQLdb操作MYSQL数据库
- Windows下安装MySQLdb, Python操作MySQL数据库的增删改查
- python操作mysql数据库实现增删改查
- Python使用MySQLdb操作MySQL
- 【MySQLdb模块】Python操作MySQL数据库
- 使用python操作mysql数据库
- [Python]MySQLdb for Python使用指南/Python的数据库操作
- Python之MySQL数据库增删改查操作
- 使用pymysql在python中对mysql的增删改查操作(二)
- 使用pymysql在python中对mysql的增删改查操作(综合)
- 在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查
- Python MySQLdb模块连接操作mysql数据库实例
- MySQLdb for Python使用指南/Python的数据库操作
- MySQLdb for Python使用指南/Python的数据库操作
- python操作三大主流数据库(1)python操作mysql①windows环境中安装python操作mysql数据库的MySQLdb模块mysql-client
- python中操作mysql数据库CRUD(增删改查)
- 黄聪:python+MySQLdb操作Mysql数据库示例代码程序教程
- MySQLdb for Python使用指南/Python的数据库操作