目录
一、安装PyMySQL模块
二、操作数据库
1、连接数据库
2、执行sql语句:execute和executemany
3、创建数据表:
三、操作MySQL数据表
1、新增数据
2、查询数据
3、修改数据
4、删除数据
5、踩到的坑:
pip install PyMySQL
连接数据库函数:pymysql.connect()
获取游标:conn.cursor()
import pymysql
#连接数据库,参数1:主机名;参数2:用户名;参数3:用户密码;参数4:数据库名称
db=pymysql.connect('localhost','root','root','studyPython')
#创建游标
cur=db.cursor()
#查询版本
cur.execute('SELECT VERSION()')
#获取查询结果
data=cur.fetchone()
print('DataBase version:%s'%data)
#关闭连接
db.close()
#连接另一台电脑上的数据库
db=pymysql.connect(host="111.118.8.124",user="root",
password="111",port=3306)
#注意:
#1- host=ip地址,通过ipconfig查看ipv4获悉
#2- 被连接的数据库用户应设置 localhost=%
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的参数值
注意:
1.数据库性能瓶颈很大一部份就在于网络IO和磁盘IO,将多个sql语句放在一起,只执行一次IO,可以有效的提升数据库性能。推荐此方法
2.用executemany()方法一次性批量执行sql语句,固然很好,但是当数据一次传入过多到server端,可能造成server端的buffer溢出,也可能产生一些意想不到的麻烦。所以,合理、分批次使用executemany是个合理的办法
SQL语句:
CREATE TABLE 表名(
字段名 字段属性
PRIMARY KEY (id) #设置主键
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
在创建数据表前,先删除以防报错。删除数据表SQL语句:
DROP TABLE IF EXISTS 表名
import pymysql
#连接数据库
db=pymysql.connect('localhost','root','root','studyPython')
#创建游标
cur=db.cursor()
#执行SQL语句,如果表存在,则删除
cur.execute('DROP TABLE IF EXISTS 'books')
#定义创建表的SQL语句
sql="""
CREATE TABLE books(
id int(8) NOT NULL AUTO_INCREMENT, #ID字段,属性整数类型8位,非空,自增加
name varchar(50) NOT NULL, #NAME字段,属性字符串类型50位,非空
categore varchar(50) NOT NULL,
price decimal(10,2) DEFAULT NULL,
publish_time date DEFAULT NULL,
PRIMARY KEY (id) #主键id
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
"""
#执行SQL语句,创建数据表
cur.execute(sql)
#关闭数据库连接
db.closer()
可以使用excute()方法添加一条记录,也可以使用excutemany()方法批量添加多条记录。
SQL语句:
excutemany(operation,seq_of_params)
import pymysql
#连接数据库
db=pymysql.connect('localhost','root','root','studyPython',charset='utf8')
#创建游标
cur=db.cursor()
#数据是列表嵌套元组的形式
data=[('零基础学python','python','79.80','2018-5-20'),
('python入门到精通','python','69.80','2018-6-18'),
('php开发','php','79.80','2016/5/21'),
('零基础java','java','59.80','2017-5-21')]
try:
#执行SQL语句,新增数据
res=cur.executemany('insert into books(name,category,price,publish_time) values (%s,%s,%s,%s)',data) #返回执行行数
#提交事务
db.commit()
except:
#发生错误时回滚
db.rollback()
#关闭数据库连接
db.closer()
注意:批量插入多条sql语句采用的是executemany(sql,args)函数,返回受影响的行数。args参数是一个包含多个元组的列表,每个元组对应一条mysql中的一条数据。这里的%s不需要加引号,否则插入数据的数据会类型错误。
新增数据可以是列表嵌套列表,执行完sql语句后,要用conn.commit()提交,否则导入不进数据。
使用execute()函数得到的只是受影响的行数,并不能真正拿到查询的内容。cursor对象还提供了3种提取数据的方法:fetchone、fetchmany、fetchall.。每个方法都会导致游标动,所以必须注意游标的位置。
cursor.fetchone():获取游标所在处的一行数据,返回元组,没有返回None
cursor.fetchmany(size):接受size行返回结果行。如果size大于返回的结果行的数量,则会返回cursor.arraysize条数据。
cursor. fetchall():接收全部的返回结果行。
import pymysql
#打开数据库连接
conn=pymysql.connect('localhost','root','123456')
conn.select_db('pythondb')
#获取游标
cur=conn.cursor()
cur.execute("select * from user;")
#fetchone()
while 1:
res1=cur.fetchone()
if res is None:
#表示已经取完结果集
break
print (res1)
#fetchall()取所有数据
resTuple=cur.fetchall()
for res in resTuple:
print(res)
print(type(resTuple))
print (‘共%d条数据’%len(resTuple))
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 where name in ('kongsh','wen');")
print('更新前的数据为:')
for res in cur.fetchall():
print (res)
print ('*'*40)
#更新2条数据
sql="update user set age=%s where name=%s"
update=cur.executemany(sql,[(15,'kongsh'),(18,'wen')])
#更新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')
conn.select_db('pythondb')
#获取游标
cur=conn.cursor()
print ('*'*40)
#删除2条数据
sql="delete from user where id=%s"
cur.executemany(sql,[(3),(4)])
cur.close()
conn.commit()
conn.close()
print('sql执行成功')
sql语句中,字符要用双引号。
cur.executemany(sql, data) # data可以是列表嵌套列表,要提交事务conn.commit()才能插入数据
单引号用tab键上方的`代替。