python对mysql数据库操作的三种不同方式
话不多说,本博的一个技术 python对mysql的操作的三种实现方式。
再此之前先引入三个知识点:
1 :__name__=='__main__'
这是什么意思呢?
1.python文件的后缀为.py
2..py文件既可以用来直接执行,也可以用来作为模块被导入,
3.在python中用import导入模块
__name__作为模块的内置属性,简单点说,就是.py文件的调用方式,如果是以模块调用__name__就等于该模块的名字(后文会继续说明),如果是直接调用__name__就等于'__main__'
2:命令行传参
何为命令行传参? 顾名思义 ,是在命令行传递参数,和常见的传递参数方式不同的是,命令行传递参数是把参数和程序写在同一个命令行来运行。
给个实际的图片看一下(我用的是linux环境,如果在windows下可用dos实现):

这里python3 是执行python程序的格式,pyt3.py 和pyt2.py是 .py程序的名字,而后面的 100 101 3都是参数。
明确了这个之后,引入一个库,sys库,这个库可以支持对命令行传递过来的参数的一些操作(后文会继续说明)。
3:pymysql这个库
注意,在python3以上版本已经不支持mysqldb这个库了,不过两者的方法基本相同。
这个库的用法主要步骤如下:
1:建立connection
2:获取cursor(可以把它当做一个游标)
3:执行sql语句
4:事务出现异常?
n:con.commit
y:con.rollback
5:获取执行sql后的数据
cursor.fetch
这里提到了事务,事务又是什么呢。简单的说,一个事务包含的所有操作都是原子操作 即 要么都执行 要么都不执行,事务有什么用呢(后文会继续说明)
好了,回归正题,那么python操作mysql数据库有哪三种方式呢? 以银行转账为例,先看第一种
1:普通方式
import pymysql
import sys
con=pymysql.Connect(host='xxx.xxx.xx.xx',port=3306,db='pytest',user='root',
passwd='xxx',charset='utf8')
cursor=con.cursor()
def is_ava(acctid):
sel_sql='select * from account where acctid=%s'%acctid
cursor.execute(sel_sql)
rs=cursor.fetchone()
try:
len(rs)
except:
return False
return True
def mon_ava(acctid,mon):
selm_sql='select *from account where acctid=%s and money>=%s'%(acctid,mon)
cursor.execute(selm_sql)
rs=cursor.fetchone()
try:
len(rs)
except:
return False
return True
sr_id=sys.argv[1]
tr_id=sys.argv[2]
dt_money=sys.argv[3]
if is_ava(sr_id) and is_ava(tr_id):
if mon_ava(sr_id,dt_money):
rm_sql=' update account set money=money-%s where acctid=%s'%(dt_money,sr_id)
add_sql=' update account set money=money+%s where acctid=%s'%(dt_money,tr_id)
try:
cursor.execute(rm_sql)
cursor.execute(add_sql)
con.commit()
except:
con.rollback()
finally:
cursor.close()
con.close()
这里纯粹是面向过程的编程思想,注意代码最后的try ,except 这里就是一个完整的事务流程,当执行remove 和add出现了异常 就进行rollback()rollback的作用就是回滚到sql语句执行前的状态。
为什么要这样呢? 试想这种情况:A给B的银行卡转账100块钱,即A-100 B+100.而B在此之前把此银行卡注销掉了, 如果不进行事务操作 就会出现:A白白丢失100块钱的情况
而我们期望的情况是这样:A-100 B+100 ,如果转账过程中出现了异常,A、B的金额都保持不变。使用事务这种原子性操作就可以确保操作的安全。
2:下面看第二种方法 面向对象方式:
# -*- coding: utf-8 -*- import pymysql
import sys
class TransforMoney(object):
def __init__(self,con):
self.con=con
self.cursor=self.con.cursor()
def is_ava(self,acctid):
sel_sql='select * from account where acctid=%s'%acctid
self.cursor.execute(sel_sql)
rs=self.cursor.fetchone()
try:
len(rs)
except:
raise Exception
def mon_ava(self,acctid,mon):
selm_sql='select *from account where acctid=%s and money>=%s'%(acctid,mon)
self.cursor.execute(selm_sql)
rs=self.cursor.fetchone()
try:
len(rs)
except:
raise Exception
def rd_mon(self,acctid,mon):
rm_sql=' update account set money=money-%s where acctid=%s'%(mon,acctid)
self.cursor.execute(rm_sql)
if self.cursor.rowcount != 1:
raise Exception
def add_mon(self,acctid,mon):
add_sql=' update account set money=money+%s where acctid=%s'%(mon,acctid)
self.cursor.execute(add_sql)
if self.cursor.rowcount != 1:
raise Exception
def transfor(self,srid,trid,mon):
try:
self.is_ava(srid)
self.is_ava(trid)
self.mon_ava(srid,mon)
self.rd_mon(srid,mon)
self.add_mon(trid,mon)
self.con.commit()
except:
self.con.rollback()
finally:
self.cursor.close()
self.con.close() if __name__=='__main__':
sr_id=sys.argv[1]
tr_id=sys.argv[2]
dt_money=sys.argv[3]
con=pymysql.Connect(host='xxx.xxx.xx.xx',port=3306,db='pytest',user='root',
passwd='xxxxx',charset='utf8')
tr_obj=TransforMoney(con)
tr_obj.transfor(sr_id,tr_id,dt_money)
把所有方法都封装到一个类里,transfor方法里同样是事务操作,前面也说道过 __name__这个内置属性,这个程序如果直接运行的话 __name__就等于__main,那么此时if __name__=='__main__' 就成立,即这句话相当于该程序的入口。
3:下面看第三种方式 模块化
# -*- coding: utf-8 -*-
"""
Created on Tue Jun 6 11:45:42 2017 @author: A
"""
import sys
import pymysql
import temp2
sr_id=sys.argv[1]
tr_id=sys.argv[2]
dt_money=sys.argv[3]
con=pymysql.Connect(host='xxx.xxx.xx.xx',port=3306,db='pytest',user='root',
passwd='xxxxx',charset='utf8')
tr_obj=temp2.TransforMoney(con)
tr_obj.transfor(sr_id,tr_id,dt_money)
是不是很短,没错,把上述第二种方式的程序保存为temp2.py ,在该程序里直接import temp2 即可调用temp2.py的类的方法,注意此时temp2.py里的__name__ 就不等于__main__了 而是等于 temp.
对了,以上的连接 host 和 passwd 我都用xxx 来表示了,因为是我个人的服务器不便于公开,实际中大家改成自己的就可以了。
python对mysql数据库操作的三种不同方式的更多相关文章
- Python进行MySQL数据库操作
最近开始玩Python,慢慢开始喜欢上它了,以前都是用shell来实现一些自动化或者监控的操作,现在用Python来实现,感觉更棒,Python是一门很强大的面向对象语言,所以作为一个运维DBA或者运 ...
- python之(mysql数据库操作)
前言:关心3步骤(此文章只针对python自动化根基展开描述) 什么是mysql数据库操作? 答:利用python对mysql数据库进行增, 删, 改, 查 操作 为什么要用python对mysql ...
- 数据库常见的三种join方式
数据库常见的join方式有三种:inner join, left outter join, right outter join(还有一种full join,因不常用,本文不讨论).这三种连接方式都是将 ...
- MySQL数据库改名的三种方法
前不久去面试,被问到Innodb引擎的表如何改数据库名,当时我也只回答了MyISAM改如何操作,被一些细节问题打败,真是操蛋. 如果表示MyISAM那么可以直接去到数据库目录mv就可以. Innodb ...
- 使用Python对MySQL数据库操作
本文介绍Python3使用PyMySQL连接数据库,并实现简单的增删改查. 什么是PyMySQL? PyMySQL是Python3.x版本中用于连接MySQL服务器的一个库,Python2.x中则使用 ...
- python的mysql数据库操作
python操作mysql数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库 ...
- python接口测试—mysql数据库操作
python操作mysql数据库 1.安装pymysql库 在python中安装pymysql第三方库,通过pip install pymysql 命令进行安装. 2.python操作mysql数据库 ...
- Python连接MySQL数据库操作
一.创建数据库及表 CREATE DATABASE testdb; USE testdb; CREATE TABLE `tb_user` ( `id` INT (11) NOT NULL AUTO_I ...
- python 连接mysql数据库操作
import pymysql.cursors # 连接数据库 connect = pymysql.Connect( host='localhost', port=3306, user='root', ...
随机推荐
- struts2 之 Action的优化配置
总结:struts2种action的配置文件会随着业务的增加而增加,导致配置文件膨胀.struts2中提供了三种方案来解决这个问题: 1. 动态方法调用来实现. 2. 通配符配置来解决. 3. 使用注 ...
- 【HDOJ 1215】七夕节
七夕节 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submissio ...
- 栈实现getMin
题目 实现一个特殊的栈,在实现栈的基本功能的基础上,在实现返回栈中最小元素的操作. 要求 pop.push.getMin操作的时间复杂度都是O(1). 设计的栈类型可以使用现成的栈结构. 解答 在设计 ...
- c标签和foreach循环不能加载
需要同时导入2个包: jstl.jar和standard.jar(大多数时候只会注意到jstl包,而忽视了standard包) 代码: c标签的写法 <%@ taglib prefix=&quo ...
- iOS开发 - 适配Https的野路子
大致写下适配Https时遇到的坑,做完服务器迁移一直通宵到现在,表示无力再多做详解,只放一些常见问题的解决方案吧 问题一.Https请求失败 1. NetManager初始化时可参考如下设置(因为我没 ...
- bzoj4031 [HEOI2015]小Z的房间
Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. ...
- MySQL常见建表选项以约束
一.CREATE TABLE 选项 1.在定义列的时候,指定列选项 1)DEFAULT <literal>:定义列的默认值 当插入一个新行到表中并且没有给该列明确赋值时,如果定义了列的默认 ...
- GTK简单了解记录
GTK+http://zh.wikipedia.org/wiki/GTK%2B#.E5.9B.BE.E5.BD.A2.E6.97.A0.E5.85.B3.E4.BB.A3.E7.A0.81 GTK+最 ...
- linux 安装memcached C/C++使用libmemcached库(续)
#include <iostream> #include <string> #include <libmemcached/memcached.h> using na ...
- express4.x的使用
①.安装 npm install -g express ②.创建应用 express [目录] 会在目录下生成 node_modules, 存放所有的项目依赖库.(每个项目管理自己的依赖,与Ma ...