一、executemany()函数
import pymysql #随机生成20条用户数据; 列表里面嵌套元组; list_infor = [('user'+str(num),'00000')for num in range(1,21)] dbconfig = { 'host' :'localhost', 'user' : 'root', 'passwd' : '123456', 'db' :'mariadb_learn' } # 1. 连接数据库连接 conn = pymysql.connect(**dbconfig) # 2. 创建游标, 给数据库发送sql指令 cur = conn.cursor() try: insert_sqli = 'insert into userinfor values(%s,%s)' cur.executemany(insert_sqli,list_infor) except Exception as Error: print('sql exrcutemany failed:',Error) else: print('sql executeamny success!') # 4. 提交sql语句, 作用于数据库; conn.commit() # 5. 先关闭游标 cur.close() # 6. 关闭数据库连接 conn.close()
输出
sql executeamny success!
import pymysql dbconfig = { 'host' :'localhost', 'user' : 'root', 'passwd' : '123456', 'db' :'mariadb_learn' } #随机生成20条用户数据; 列表里面嵌套元组; list_infor = [('user'+str(num),'00000')for num in range(1,21)] update_infor = [userinfor[0] for userinfor in list_infor[4:15]] #1.数据库连接 conn = pymysql.connect(**dbconfig) #2.创建游标,用于给数据库发送sql指令 cur = conn.cursor() #3.执行sql语句 : 一次性插入多条信息 try: update_sqli = 'update userinfor set passwd = "13324" where username = %s' cur.executemany(update_sqli, update_infor) except Exception as Error: print('sql update failed',Error) else: print('sql update success') #4 . 提交sql语句,作用于数据库 conn.commit() #5.关闭游标 cur.close() #6.关闭数据库 conn.close()
输出:
sql update success

二、fetchone()、fetchall()、fetchmany()
import pymysql dbconfig = { 'host' :'localhost', 'user' : 'root', 'passwd' : '123456', 'db' :'mariadb_learn' } # 1. 连接数据库连接 conn = pymysql.connect(**dbconfig) # 2. 创建游标, 给数据库发送sql指令 cur = conn.cursor() # 3. 执行sql语句: 查看数据 cur.execute('select * from userinfor;') print(cur.fetchone()) print(cur.fetchone()) print(cur.fetchmany(5)) cur.scroll(0,'absolute') print(cur.fetchall()) cur.close() conn.close()
输出:
('user1', '00000') ('user2', '00000') (('user3', '00000'), ('user4', '00000'), ('user5', '13324'), ('user6', '13324'), ('user7', '13324')) (('user1', '00000'), ('user2', '00000'), ('user3', '00000'), ('user4', '00000'), ('user5', '13324'), ('user6', '13324'), ('user7', '13324'), ('user8', '13324'), ('user9', '13324'), ('user10', '13324'), ('user11', '13324'), ('user12', '13324'), ('user13', '13324'), ('user14', '13324'), ('user15', '13324'), ('user16', '00000'), ('user17', '00000'), ('user18', '00000'), ('user19', '00000'), ('user20', '00000'))
三、练习
import pymysql dbconfig = { 'host' :'localhost', 'user' : 'root', 'passwd' : '123456', 'db' :'mariadb_learn' } # 1. 连接数据库连接 conn = pymysql.connect(**dbconfig) # 2. 创建游标, 给数据库发送sql指令 cur = conn.cursor() # 3. 执行sql语句: 查看数据 cur.execute('select * from userinfor;') try: with open('/tmp/userinfor','w') as file_it: for row_infor in cur.fetchall(): file_it.write(':'.join(row_infor)+'\n') except Exception as Error: print(Error) else: print("success") finally: cur.close() conn.close()

四、description属性
import pymysql dbconfig = { 'host' :'localhost', 'user' : 'root', 'passwd' : '123456', 'db' :'mariadb_learn' } # 1. 连接数据库连接 conn = pymysql.connect(**dbconfig) # 2. 创建游标, 给数据库发送sql指令 cur = conn.cursor() # 3. 执行sql语句: 查看数据 cur.execute('select * from userinfor;') print(cur.description) cur.close() conn.close()
输出:
(('username', 253, None, 10, 10, 0, True), ('passwd', 253, None, 10, 10, 0, True))
conn = pymysql.connect(
'host' ='localhost', 'user' = 'root', 'passwd' = '123456', 'db' ='mariadb_learn')
import pymysql import os dbconfig = { 'host': 'localhost', 'user': 'root', 'passwd': '123456', 'db': 'mariadb_learn'} #第归扫描得到指定文件目录下的所有文件,#所有的.jpg图片的文件名存入列表 def SearchAbsPath(dirname): dirname = os.path.abspath(dirname) filenames = list() for root, dirs, files in os.walk(dirname, topdown=False): # 扫描一层目录 for name in files: filenames.append(root + os.path.sep + name) # 每一个文件的绝对路径放入列表 images = [image_file for image_file in filenames if image_file.endswith('.jpg')] return images # 将所有的图片存入到数据库中 def insert_images(**kwargs): # 1. 连接数据库连接 conn = pymysql.connect(**kwargs) # 2. 创建游标,给数据库发送sql指令 cur = conn.cursor() def create_connt(): try: cur.execute('create table images(' 'id int primary key auto_increment , ' 'imgName varchar(50),' 'imgData mediumblob);') # id int primary key auto_increment 这一列的表头信息为id 整形数,即图片的id, # primary key :作为该表的主键, auto_increment : id 可由系统随机生成 # imgName 图片的名字 # imgData mediumblob 存储的图片,imgData 为表头,mediumblob以二进制中等大小文件形式存储。 except Exception as Eorr: raise Eorr else: print('table create sucess!') create_connt() try: insert_sqli = 'insert into images (imgName, imgData) values(%s, %s);' for images in SearchAbsPath('/tmp/images/'): file_it = open(images, 'rb') img_data = file_it.read() file_it.close() cur.execute(insert_sqli,(images,img_data)) except Exception as Eorr: raise Eorr else: print("插入图片信息成功!") finally: conn.commit() cur.close() conn.close() insert_images(**dbconfig)
七、数据库中图片的读取。
import pymysql import os def decode(s): return ''.join([chr(i) for i in [int(b, 2) for b in s.split(' ')]]) dbconfig = {'host' : 'localhost', 'user' : 'root', 'passwd': '123456', 'db' : 'mariadb_learn'} def DownLoad_Image_from_db(download_dir='/tmp/download/',**kwargs): """ :param download_dir: 从数据库中读取的图片的保存到本地的目录 :param kwargs: 数据连接的参数 :return: """ conn = pymysql.connect(**kwargs) cur = conn.cursor() cur.execute('select * from images') while True: # 使用fetchone 可以保证内存不会因为一次性读取的图片内存过大,而导致内存崩溃 row = cur.fetchone() #row是三个元素的元组分别是id,imgName、imgData if row != None: with open(download_dir+os.path.split(row[1])[1],'wb') as fileit_img: fileit_img.write(row[2]) pass else: break cur.close() conn.close() DownLoad_Image_from_db(**dbconfig)
八、用户和访问权限的操作。
mysql -h 192.168.3.25 -uroot -p123456
#创建一个密码为123456的userone用户,只能在本地对数据库进行访问。 create user userone@localhost identfiend by '123456' #创建一个密码为123456的userone用户,只能在ip为192.163.3.15的主机上访问我的数据库 create user userone@192.163.3.15 identfied by '123456' #创建一个密码为123456的userone用户,可以在所有的ip上访问我的数据库。 create user userone@'%' identified by '123456' #创建无密码的userone用户,可以在所有的ip上访问我的数据库。 create user userone@'%'
grant <权限> on <数据库>.<表> to <用户>@<ip> #让userone用户在本地连接数据库时, #对mariadb_learn数据库中的userinfor #表拥有insert,update、delete、select、create权限 grant (insert,update,delete,select,create) on mariadb_learn.userinfor to userone@localhost;
flush privileges; #重读用户授权表
how grants for userone@localhost; #查看userone用户的授权表。
revoke delete,update on mariadb_learn.* from userinfor@localhost; #删除用户的指定权限。
drop user userone@localhost #删除userone用户。
九、对数据库进行备份。
十、多台mysql主机的远程备份。
import os import time from mysqlInfo import mysql_list BACKUP_DIR = '/mnt/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) else: print('sucess')
十一、银行转账系统的简单实现。
Python DB API 2.0 的事务提供了两个方法 commit 或 rollback。
import pymysql import sys class TransferMoney(object): def __init__(self,conn): self.conn = conn def transfer(self,source_acctid,target_asstid,money): """ 转账函数 :param source_acctid: :param target_asstid: :param money: :return: """ try : self.check_acct_available(source_acctid) self.check_acct_available(target_asstid) self.has_enough_money(source_acctid,money) self.reduce_money(source_acctid,money) self.add_money(target_asstid,money) self.conn.commit() except Exception as Error: self.conn.rollback() #数据库的方法,撤销前面对数据库的操作 raise (Error) def check_acct_available(self,acctid): """ 检查账户是否存在 :param acctid: 需要被检查的账户 :return: """ cur = self.conn.cursor() #数据库游标建立 try: select_sql = 'select * from account where accid = %s;'%(acctid) cur.execute(select_sql) print("execute aql :%s"%(select_sql)) res = cur.fetchall() if len(res) != 1: raise Exception('账号%s不存在'%(acctid)) except Exception as Error: raise (Error) finally: cur.close() def has_enough_money(self, acctid, money): """ 检查账户是否有足够的金钱 :param acctid: 当前账户 :param money: 需要判断的的金额 :return: """ cur = self.conn.cursor() try: select_sql = 'select money from account where accid = %s'%(acctid) cur.execute(select_sql) print('has_enough_money aql:%s'%(select_sql)) res = cur.fetchall() if res: now_money = res[0][0] if now_money < int(money): raise Exception('账户%s没有足够的钱,目前金额为%s',acctid,money) except Exception as Error: raise (Error) finally: cur.close() def reduce_money(self, acctid, money): """ 对账户的减去指定的金额 :param acctid: 账户 :param money: 减去的金额 :return: """ cur = self.conn.cursor() try: update_sqli = 'update account set money = money-%s where accid = %s'%(money,acctid) cur.execute(update_sqli) print('add_money sql:%s'%(update_sqli)) except Exception as Error: raise (Error) finally: cur.close() def add_money(self, asstid, money): """ 指定账户增加相应的钱数 :param asstid: 增加金额的账户 :param money: 增加的金额 :return: """ cur = self.conn.cursor() try: update_sqli = 'update account set money = money+%s where accid = %s'%(money,asstid) cur.execute(update_sqli) print('add_money sql:%s'%(update_sqli)) except Exception as Error: raise (Error) finally: cur.close() def main(): db_dict ={'host' :'localhost', 'user' : 'root', 'passwd' : '123456', 'db' :'mariadb_learn'} conn = pymysql.connect(**db_dict) trans_money = TransferMoney(conn) source_acctid = sys.argv[1] target_acctid = sys.argv[2] money = sys.argv[3] try : trans_money.transfer(source_acctid,target_acctid,money) except Exception as Eorr: print (Eorr) finally: conn.close() if __name__ == '__main__': main()
文章来源: python学习笔记之数据库表的读写操作