python 操作 mysql
import pymysql
#1、基本语法
#(1)创建链接 host、user、paaword、database这四个参数必须写
conn = pymysql.connect(host = '127.0.0.1',user = 'root',password = '123456',database = 'db1',charset = 'utf8',port = 3306)
#(2)创建游标对象,该对象可以进行增删改查操作
cursor = conn.cursor()
(3)执行sql语句
sql = 'select * from t1'
res = cursor.execute(sql)
print(res) # 返回是数据条数
(4)获取数据
res = cursor.fetchone()
print(res)
(5)释放游标对象
cursor.close()
(6)关闭链接
conn.close()
创建/删除表
conn = pymsql.connect(host = '127.0.0.1',user = 'root',password = '123456',database = 'db1')
cursor = conn.cursor()
#(1)创建一张表
sql = 'create table t1(id int,name varchar(255))'
res = cursor.execute(sql)
print(res)
#(2)查看表结构
sql = ‘desc t1’
res = cursor.execute(sql)
print(res) # 返回的是字段数
print(cursor.fetchone()) # 只获取第一条数据
#(3)删除表
try:
sql = 'drop table t1'
res = cursor.execute(sql)
print(res)
except:
pass
cursor.close()
conn.close()
事务处理
python操作事务处理必须通过commit提交数据才会真正的更新数据,否则rollback回滚,恢复到以前状态
conn = pymysql.connect(host = "127.0.0.1",user = "root",password = "123456",database = "db1")
cursor = conn.cursor()
sql1 = "begin"
sql2 = "select * from t1"
res1 = cursor.execute(sql1)
res2 = cursor.execute(sql2)
print(res1,res2)
print(cursor.fetchone())
sql3 = "update t1 set name = 'egon' where id = 1"
res3 = cursor.execute(sql3)
sql4 = "commit"
res4 = cursor.execute(sql4)
print(res1,res2,res3,res4) # 0 有数据 0 0 只有查询数据的时候有返回值代表数据条数,通过获取数据得到默认是元组形式
sql注入问题
import pymysql
conn = pymysql.connect(host = "127.0.0.1",user = "root",password = "123456",database = "db1",charset = "utf8")
cursor = conn.cursor()
username = input("用户名:").strip()
password = input("密码:").strip()
sql = "select * from user where name = %s and pwd = %s"
rows = cursor.execute(sql,(username,password))
if rows:
print("登陆成功")
else:
print("登陆失败")
conn.commit()
cursor.close()
conn.close()
(1)发现问题:输入:egon' or 1 =1 -- '123' 可以直接登陆,不管用户名、密码正确与否
其中 or 1=1 代表真
-- 代表后面的代码注释
(2)解决问题
使用预处理机制,可以避免绝大多数的sql注入问题
execute参数是一个sql语句,如果sql语句和里面的参数值分开执行,默认开启预处理
execute(sql,(参数1,参数2,参数3))
python 操作mysql增删改查
import pymysql
#1、创建mysql链接
conn = pymysql.connect(host = "127.0.0.1",user = "root",password = "123456",database = "db1")
#查询数据默认是元组,可以设置返回字典类型,pymysql.cursors.DictCursor
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor) #通过获取数据来显示字典类型,例cursor.fetchone()
#增
sql1 = "insert t1(first_name,last_name,age,sex,money) values(%s,%s,%s,%s,%s)"
res = cursor.execute(sql,("王","振",80,0,12000))
...
python操作mysql时候,默认开启事务,必须在增删改之后提交数据,才会对数据产生影响,否则默认回滚
提交数据:conn.commit()
回滚数据:conn.rollback()
execute 指定单条数据
executemany 执行多条数据
...
#一次插入多条数据
res = cursor.executemany(sql,[("李","平",16,0,12333),("王","菊",18,0,9000)])
print(res)
#获取最后插入这条数据的id号(针对于单条数据执行,获取最后的id,如果多条数据的执行,以第一条数据的id为主)
print(cursor.lastrowid)
#针对于多条数据最后的id,可以通过倒序查询,找到id号
select id from t1 order by ud desc limit1
#删
sql = "delete from t1 where id = %s"
res = cursor.execute(sql,(8,))
if res:
print("successful")
else:
print("fail")
#改
sql = "update t1 set first_name = %s where id = %s"
res = cursor.execute(sql,("王",10))
print(res)
if res:
print("successful")
else:
print("fail")
#查
sql = "select * from t1"
res = cursor.execute(sql)
print(res) # 字段的总条数
#(1)获取一条数据 fetchone
res = cursor.fetchone()
print(res)
#(2)获取多条数据 fetchmany默认从上一条数据继续向下搜索(性质类似于迭代器)
data = cursor.fetchmany() # 没有参数,默认只获取一条
date = cursor.fetchmany(3) # 获取3条
print(data)
#(3)获取所有数据fetchall基于上一条数据往下搜索(性质类似于迭代器)
data = cursor.fetchall()
print(data)
for row in data:
first_name = row["first_name"]
last_name = row["last_name"]
age = row["age"]
if row["sex"] == "0":
sex = "女性`"
else:
sex = "男性"
money = row["money"]
print("姓:{},名:{},年龄:{},性别:{},收入:{}".format(first_name,last_name,age,sex,money))
#在进行增删改的时候,必须通过commit提交数据,才会对数据库进行更新,否则默认回滚
conn.commit()
cursor.close(0
conn.close()
自定义搜索查询的位置
1、相对滚动
cursor.scroll(3,mode = "relative") # 向后滚动了
res = cursor.fetchone()
print(res)
cursor.scroll(-3,mode = "relative") # 向前滚动了
无论前后,不能超出范围
2、绝对滚动(永远基于第一条数据的位置滚动)
cursor.scroll(0,mode = "absolute") # 第一条数据是相对于0的位置滚动
res = cursor.fetchone()
print(res)
cursor.scroll(1,mode = "absolute") # 绝对查找,只根据第一条数据中相对于0的位置滚动
cursor.scroll(2,mode = "absolute") # 绝对查找,只根据第一条数据中相对于0的位置滚动
导入导出数据库
导出数据库
第一步:先退出数据库
第二步:切换到对应的导出路径
第三步:导出所有 mysqldump -uroot -p123456 数据库名>数据库名.sql
** 导出单个** mysqldump -uroot -p123456 db1 t1>t1.sql
导入数据库
第一步:先创建一个空的数据库
第二步:找到对应的sql文件的路径
第三步:source 路径/sql 文件