一、批量更新
前面我们产生了一些表单,username和passwd,当我们需要批量的修改时;
import pymysql
from colorFont import *
#连接数据库
conn = pymysql.connect(host='localhost',user='root',passwd='yutao',
db='yutao',charset='utf8')
#创建游标
cur = conn.cursor()
res = cur.execute('select * from userinfo;')
try:
for i in range(20,31):
print(i)
update_sql = 'update userinfo set passwd="666666" where username="user%s";'
cur.execute(update_sql, i)
except Exception as e :
print(e)
print(FAIL + "sql execute failed"+ END)
else:
print(OKGREEN + "sql execute success" + END)
conn.commit()
cur.close()
conn.close()
代码内容很简单,我就不在此多作解释了,如果到你的电脑上跑不起来给你个建议,在你觉得可能会出错的地方打印,慢慢的就会排错;
二、封装数据库
在前面的几张博客中细心的你会发现,我们做了许许多多的重复,举个例子,就像下面的这些代码:
import pymysql
from colorFont import *
#连接数据库
conn = pymysql.connect(host='localhost',user='root',passwd='yutao',
db='yutao',charset='utf8')
#创建游标
cur = conn.cursor()
try:
pass
except Exception as e :
print(e)
print(FAIL + "sql execute failed"+ END)
else:
print(OKGREEN + "sql execute success" + END)
conn.commit()
cur.close()
conn.close()
那么我们为什么不想把法把他们打包封装起来,就像我们在使用标准库里的包一样,直接调用不是更好吗,下面我们就有了新的目标:把这些重复量很高的代码封装打包;
1、数据库信息封装
试想一下,你是一个数据库管理员,现在要你去上百台数据库中拿取东西,那么到要你记住每一个数据库的名字和信息吗?
为何不把他们封装在一起,你需要的时候可以轻易的调取就可以了;
注意:我们在起名子时,最好用英文数字,避免中文以免编码格式问题出现差错
db_config = {
'host':'localhost',
'user':'root',
'passwd':'789',
'db':'yutao',
'charset':'utf8'
}
db_config01 = {
'host':'localhost',
'user':'root',
'passwd':'456',
'db':'yutao',
'charset':'utf8'
}
db_config02 = {
'host':'localhost',
'user':'root',
'passwd':'123',
'db':'yutao',
'charset':'utf8'
}
2、现在来封装连接数据库的函数类
这里的config包就是我们上面封装的数据库信息
import pymysql
import config
from colorFont import *
class Mypackage(object):
def __init__(self,db_config):
try:
self.db_config = db_config
self.conn = pymysql.connect(**self.db_config)
self.cur = self.conn.cursor()
except Exception as e:
print(FAIL +'数据库连接失败:',e + END)
else:
print(OKGREEN +'数据库连接成功' + END)
def __str__(self):
return "Connect (%s user=%s db=%s)"%(self.db_config['host'],self.db_config['user'],self.db_config['db'])
def __del__(self):
self.conn.commit()
self.cur.close()
self.conn.close()
a = Mypackage(config.db_config)
以后如果我们需要,只需要改动很小的部分代码就能连接上数据库;
三、获取单个表的信息和字段
这部分代码其实是对前面mysql语句的应用而已,并没有特别难理解的内容import pymysql
from colorFont import *
# 1. 连接数据库连接
conn = pymysql.connect(host='localhost', user='root',
passwd='yutao', db='yutao',
charset='utf8')
# 2. 创建游标, 给数据库发送sql指令
cur = conn.cursor()
try:
# 3. 执行sql语句: 查看数据
res = cur.execute('select * from userinfo;')
desc = cur.description
print("表的描述信息:", desc)
table_header = [item[0] for item in desc]
print("表头:", table_header)
print("\t".join(table_header))
for row in cur.fetchall():
print("\t".join(row))
except Exception as e:
print(e)
print(FAIL + "sql execute failed" + END)
else:
print(OKGREEN + "sql execute success" + END)
# 4. 先关闭游标
cur.close()
# 5. 关闭数据库连接
conn.close()
四、给我们的数据库中插入图片
首先还是建立连接、创建邮标;
import pymysql
from colorFont import *
conn = pymysql.connect(host='localhost', user='root',
passwd='yutao', db='westos',
charset='utf8')
# 2. 创建游标, 给数据库发送sql指令
cur = conn.cursor()
# 3. 执行sql语句:
# 1). 创建存储图片的数据库表;
try:
cur.execute('create table images(id int primary key auto_increment , imgName varchar(50),imgData mediumblob); ')
except Exception as e:
print(e)
print(FAIL + "sql execute failed" + END)
else:
print(OKGREEN + "table create sucess!" + END)
# 2). 插入图片;
try:
insert_sqli = 'insert into images (imgName, imgData) values(%s, %s);'
f = open('img/img01.jpg', 'rb')
img_data = f.read()
f.close()
cur.execute(insert_sqli, ('img01.jpg', img_data ))
except Exception as e:
print(e)
else:
print("插入图片信息成功!")
conn.commit()
# 4. 先关闭游标
cur.close()
# 5. 关闭数据库连接
conn.close()
我们在创建储存图片的数据库时,可以现在我们的命令行实现,然后再粘到我们的语句中,避免了手残敲错字母导致没法成功;
我们写入数据库的是以二进制的方式写入的,所以文件打开方式为‘rb’
我们这里的照片放在了当前统一目录下,所以时用的是相对路径;如果你的照片放在其他目录中,那么就要用绝对路径;可是当我们查看images时,看到一堆乱码,可是这并不是我们希望看到的结果
所以,请往下看...
五、读取照片
这里我们进行了强转码,把二进制强转为utf8
import json
import pymysql
from colorFont import *
conn = pymysql.connect(host='localhost', user='root',
passwd='yutao', db='westos',
charset='utf8')
# 2. 创建游标, 给数据库发送sql指令
cur = conn.cursor()
try:
cur.execute("select * from images")
with open('image.png', 'wb') as fout:
fout.write((json.dumps(cur.fetchone()[0]).encode('utf8')))
# fout.write(cur.fetchone()[0])
except Exception as e:
print(e)
print(FAIL + "sql execute failed" + END)
else:
print(OKGREEN + "sql execute success" + END)
cur.close()
conn.close()
六、多台mysql主机的远程备份
import os
from colorFont import *
import time
mysql_list = [
{
'host':'172.25.254.60',
'user':'root',
'passwd':'yutao',
'db':'yutao'
}
]
BACKUP_DIR = '/tmp/BACKUP/'
if not os.path.exists(BACKUP_DIR):
os.mkdir(BACKUP_DIR)
print("%s create success!" % (BACKUP_DIR))
else:
try:
for host in mysql_list:
# date = os.popen('date +%Y_%m_%d')
shell_sen = "mysqldump -h %s -u%s -p%s %s >%s"
host_ip = host['host']
user = host['user']
passwd = host['passwd']
db = host['db']
backup_filename = BACKUP_DIR + '%s_%s.dump' %(host_ip, db)
print(backup_filename)
print(shell_sen % (host_ip, user, passwd, db, backup_filename))
os.system(shell_sen % (host_ip, user, passwd, db, backup_filename))
print("backup %s host" %(host_ip))
except Exception as e:
print(e)
print(FAIL + "sql execute failed" + END)
else:
print(OKGREEN + "sql execute success" + END)
os.mknod(time.ctime())
