1、Python连接数据库
要想操作数据库,仅连接数据是不够的,必须拿到操作数据库的游标才能进行后续操作,比如读取数据、添加数据。通过获取到的数据库连接示例conn下的cursor()方法来创建游标。游标用来返回结果。
import pymysql
conn = pymysql.connect('locahost',user='root',passwd='123456',db='testdb',charset='utf-8')
cusor = conn.cursor
备注:cursor返回一个游标实例对象,其中包含很多操作数据的方法,比如执行SQL语句。
执行SQL语句execute和executemany:
execute(query,args=None):执行单条SQL语句,执行成功后返回受影响的行数。query为要执行的sql语句,且为字符串类型。args为可选的序列或映射,用于query的参数值,如果args为序列,query中必须使用%s做占位符;如果args为映射,query中必须使用%(key)s做占位符。
executemany(query,args=None):批量执行SQL语句,比如批量插入数据,执行成功后返回受影响的行数,query为要执行的sql语句,且为字符串类型。args为嵌套的序列或映射,用于query的参数值。
示例:
创建数据库:
import pymysql
#打开数据库连接,不需要指定数据库,因为需要创建数据库
conn = pymysql.connect('locahost',user='root',passwd='123456',charset='utf-8')
#获取游标
cusor = conn.cursor
#创建数据库
cursor.execute('CREATE DATABASE IF NOT EXISTS pythonDB DEFAULT CHARSET utf8 COLLATE utf8_general_ci;')
#先关闭游标
cursor.close()
#再关闭数据库
con.close()
print('数据库创建成功')
备注:创建后可使用show databases查询确认
创建表:
import pymysql
#打开数据库连接,指定数据库
conn = pymysql.connect('locahost',user='root',passwd='123456',db='testdb',charset='utf-8')
#获取游标
cusor = conn.cursor
#创建user表
cursor.execute('drop table if exists user')
sql="""CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0"""
cursor.execute(sql)
#先关闭游标
cursor.close()
#再关闭数据库
con.close()
print('user表创建成功')
插入单条数据:
import pymysql
#打开数据库连接,不指定数据库
conn = pymysql.connect('locahost',user='root',passwd='123456',charset='utf-8')
#选择需要连接的数据库
conn.select_db('testdb') #获取游标
cusor = conn.cursor
insert = cur.execute("insert into user values(1,'tom',18)")
print("添加语句受影响的行数:",insert)
#第二种插入数据的方式,通过字符串传入值
sql = "insert into user values(%s,%s,%s)"
cur.execute(sql,(3,'kongsh',20))
#先关闭游标
cursor.close()
#再关闭数据库
con.close()
print('SQL执行成功')
批量插入多条数据:
import pymysql
#打开数据库连接,不指定数据库
conn = pymysql.connect('locahost',user='root',passwd='123456',charset='utf-8')
#选择需要连接的数据库
conn.select_db('testdb')
cusor = conn.cursor #获取游标
sql = "insert into user values(%s,%s,%s)"
cur.executemany(sql,[(4,'wen',20),(5,'tom',10),(6,'test',30)])
#先关闭游标
cursor.close()
#再关闭数据库
con.close()
print('SQL执行成功')
备注:批量插入多条SQL语句采用的是executemany(sql,args)函数,返回受影响的行数。
args参数是一个包含多个元组的列表,每个元组对应一条mysql中的一条数据。这里的%s不需要加引号,否则插入数据的数据类型错误
查询数据:
使用execute()函数得到的只是受影响的行数,并不能真正拿到查询的内容。cursor对象还提供了3中提取数据的方法:fetchone、fetchmany、fetchall。每个方法都会导致游标移动。
cursor.fetchone():获取游标所在处的一行数据,返回元组,没有返回None;
cursor.fetchmany(size):接受size行返回结果行。如果size大于返回的结果行的数量,则会返回cursor.aruuaysize条数据。
cursor.fetchall():接收全部的返回结果行。
示例:
fetchone:
import pymysql
#打开数据库连接,不指定数据库
conn = pymysql.connect('locahost',user='root',passwd='123456',charset='utf-8')
#选择需要连接的数据库
conn.select_db('testdb')
cusor = conn.cursor #获取游标
cur.execute("select * from user")
while 1:
res = cur.fetchone()
if res is None:
break
print(res)
#先关闭游标
cursor.close()
#再关闭数据库
con.close()
print('SQL执行成功')
#输出结果:
(1,'tom',18)
(3,'kongsh',20)
(4,'wen',20)
(5,'tom',10)
(6,'test',30)
备注:fetchone()函数必须跟execute()函数结合使用,并且在execute()函数之后使用。
fetchmany:
import pymysql
#打开数据库连接,不指定数据库
conn = pymysql.connect('locahost',user='root',passwd='123456',charset='utf-8')
#选择需要连接的数据库
conn.select_db('testdb')
cusor = conn.cursor #获取游标
cur.execute("select * from user")
resTuple = cur.fetchmany(3)
for res in resTuple:
print(res)
#先关闭游标
cursor.close()
#再关闭数据库
con.close()
print('SQL执行成功')
#输出结果:
(1,'tom',18)
(3,'kongsh',20)
(4,'wen',20)
备注:从exceute()函数结果中获取游标所在处的size条数据,并以元组的形式返回,
元组的每一个元素都也是一个由一行数据组成的元组,如果size大于有效的结果行数,
将会返回cursor.arraysize条数据,但如果游标所在处没有数据,将返回空元组。
查询几条数据,游标将会向下移动几个位置。fetmany()函数必须跟exceute()函数结合使用,
并且在exceute()函数之后使用
fetchall:
import pymysql
#打开数据库连接,不指定数据库
conn = pymysql.connect('locahost',user='root',passwd='123456',charset='utf-8')
#选择需要连接的数据库
conn.select_db('testdb')
cusor = conn.cursor #获取游标
cur.execute("select * from user")
resTuple = cur.fetchall()
print("共%d条数据"%len(resTuple))
#先关闭游标
cursor.close()
#再关闭数据库
con.close()
print('SQL执行成功')
更新数据:
更新单条数据:
import pymysql
#打开数据库连接,不指定数据库
conn = pymysql.connect('locahost',user='root',passwd='123456',charset='utf-8')
#选择需要连接的数据库
conn.select_db('testdb')
cusor = conn.cursor #获取游标
#更新一条数据
update = cur.execute("update user set age=100 where name='kongsh'")
print ('修改后受影响的行数为:',update)
#查询一条数据
cur.execute('select * from user where name="kongsh";')
print(cur.fetchone())
#先关闭游标
cursor.close()
#再关闭数据库
con.close()
print('SQL执行成功')
更新多条数据:
import pymysql
conn = pymysql.connect("localhost",'root','123456',charset='utf-8')
conn.select_db("testdb")
cursor = conn.cursor()
#更新前查询所有数据
cur.execute("select * from user where name in ('kongsh','wen');")
for res in cur.fetchall():
print(res)
#更新两条数据
sql = update user set age=%s where name=%s
update = cur.executemany(sql,[(15,'kongsh'),(18,'wen')])
cur.execute()
#更新2条数据后查询所有数据
cur.execute("select * from user where name in ('kongsh','wen');")
print('更新后的数据为:')
for res in cur.fetchall():
print (res)
cur.close()
conn.commit()
conn.close()
print('sql执行成功')
删除数据:
删除单条数据:
import pymysql
conn = pymysql.connect("localhost",'root','123456',charset='utf-8')
conn.select_db("testdb")
cursor = conn.cursor()
#更新前查询所有数据
cur.execute("select * from user;")
print("删除前的数据为:")
for res in cur.fetchall():
print(res)
#删除一条数据
sql = 'delete from user where id=1'
cur.execute()
#查询删除后的所有数据
cur.execute("select * from user")
print('更新后的数据为:')
for res in cur.fetchall():
print (res)
cur.close()
conn.commit()
conn.close()
print('sql执行成功')
删除多条数据:
import pymysql
conn = pymysql.connect("localhost",'root','123456',charset='utf-8')
conn.select_db("testdb")
cursor = conn.cursor()
#更新前查询所有数据
cur.execute("select * from user;")
print("删除前的数据为:")
for res in cur.fetchall():
print(res)
#删除两条数据
sql = 'delete from user where id=%s'
cur.executemany(sql,[(3),(4)])
#查询删除后的所有数据
cur.execute("select * from user")
print('更新后的数据为:')
for res in cur.fetchall():
print (res)
cur.close()
conn.commit()
conn.close()
print('sql执行成功')
事务回滚:
import pymysql
#打开数据库连接
conn=pymysql.connect('localhost','root','123456')
conn.select_db('pythondb')
#获取游标
cur=conn.cursor()
#修改前查询所有数据
cur.execute("select * from user;")
print('修改前的数据为:')
for res in cur.fetchall():
print (res)
print ('*'*40)
#更新表中第1条数据
cur.execute("update user set name='xiaoxiaoxiaoxiaoren' where id=5")
#修改后查询所有数据
cur.execute("select * from user;")
print('修改后的数据为:')
for res in cur.fetchall():
print (res)
print ('*'*40)
#回滚事务
conn.rollback()
cur.execute("select * from user;")
print('回滚事务后的数据为:')
for res in cur.fetchall():
print (res)
cur.close()
conn.commit()
conn.close()
print('sql执行成功')
插入100条数据到数据库:
'''插入100条数据到数据库(每次插入一条)'''
import pymysql
import string,random
#打开数据库连接
conn=pymysql.connect('localhost','root','123456')
conn.select_db('testdb')
#获取游标
cur=conn.cursor()
#创建user表
cur.execute('drop table if exists user')
sql="""CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0"""
cur.execute(sql)
#修改前查询所有数据
cur.execute("select * from user;")
print('修改前的数据为:')
for res in cur.fetchall():
print (res)
print ('*'*40)
#循环插入数据
words=list(string.ascii_letters)
sql="insert into user values(%s,%s,%s)"
for i in range(100):
random.shuffle(words)#打乱顺序
cur.execute(sql,(i+1,"".join(words[:5]),random.randint(0,80)))
#插入100条后查询所有数据
cur.execute("select * from user;")
print('修改后的数据为:')
for res in cur.fetchall():
print (res)
print ('*'*40)
cur.close()
conn.commit()
conn.close()
print('sql执行成功')
一次插入多条:
'''插入100条数据到数据库(一次插入多条)'''
import pymysql
import string,random
#打开数据库连接
conn=pymysql.connect('localhost','root','123456')
conn.select_db('testdb')
#获取游标
cur=conn.cursor()
#创建user表
cur.execute('drop table if exists user')
sql="""CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0"""
cur.execute(sql)
#修改前查询所有数据
cur.execute("select * from user;")
print('修改前的数据为:')
for res in cur.fetchall():
print (res)
print ('*'*40)
#循环插入数据
words=list(string.ascii_letters)
sql="insert into user values(%s,%s,%s)"
random.shuffle(words)#打乱顺序
cur.executemany(sql,[(i+1,"".join(words[:5]),random.randint(0,80)) for i in range(100) ])
#插入100条后查询所有数据
cur.execute("select * from user;")
print('修改后的数据为:')
for res in cur.fetchall():
print (res)
print ('*'*40)
cur.close()
conn.commit()
conn.close()
print('sql执行成功')
Python调用mysql存储过程:
# encoding: utf-8
# sql导出
# mysqldump -u root -p db_name > test_db.sql
import MySQLdb
class MySqlOp(object):
def __init__(self, login_msg):
self.host = login_msg[0]
self.port = login_msg[1]
self.db_name = login_msg[2]
self.user = login_msg[3]
self.passwd = login_msg[4]
self.charset = 'utf8'
# 更新
def operate(self, sql):
db = MySQLdb.connect(host=self.host, port=self.port, user=self.user, passwd=self.passwd, db=self.db_name, charset=self.charset)
cur = db.cursor()
try:
# 执行sql语句
cur.execute(sql)
cur.close()
# 提交到数据库执行
db.commit()
except Exception as e:
print(e)
cur.close()
# Rollback in case there is any error
db.rollback()
# 关闭数据库连接
db.close()
# 插入
def select(self, sql):
db = MySQLdb.connect(host=self.host, port=self.port, user=self.user, passwd=self.passwd, db=self.db_name, charset=self.charset)
cur = db.cursor()
results = None
try:
# 执行sql语句
cur.execute(sql)
# 获取所有记录列表
results = cur.fetchall()
# print(results)
except Exception as e:
print(e)
# 关闭数据库连接
db.close()
return results
# 调用存储过程
def callproc(self, sql, args=[]):
db = MySQLdb.connect(host=self.host, port=self.port, user=self.user, passwd=self.passwd, db=self.db_name, charset=self.charset)
cur = db.cursor()
results = None
try:
# 执行sql语句
cur.callproc(sql, args)
# 获取所有记录列表
results = cur.fetchall()
cur.close()
# 提交到数据库执行
db.commit()
# print(results)
except Exception as e:
print(e)
# 关闭数据库连接
cur.close()
# Rollback in case there is any error
db.rollback()
db.close()
return results
@classmethod
def int_c(cls, int_):
'''
整数处理
'''
return int_ if int_ else 'null'
@classmethod
def str_c(cls, str_):
'''
字符串处理
'''
return "'{}'".format(str_) if str_ else 'null'
调用:
if __name__ == '__main__':
# 连接信息 [ip, 端口, 数据库名, 用户名, 密码]
login_msg = ['192.168.0.1', 3306, 'student_db', 'paisen', 'abcd1234']
msq = MySqlOp(login_msg)
# 查询
book = msq.select('''show full columns from data;''')
print(book)
# 更新
msq.operate('''insert into student (no, name) values (1, "刘华强");''')
# 调用存储过程
cover = msq.callproc('getDataCoverPath', [100,])
print(cover)