对于Python操作MySQL主要使用两种方式:
原生模块 pymysql
python2中模块安装
sudo apt-get install python-mysqldb sudo pip install mysql-python
python3中模块安装
Linux上:yum install MySQL-python CentOS root下安装
Windows上:pip3 install pymysql (或者在pycharm中安装pyMySQL)
连接成功了吗?
以下均为个人在实际操作中总结的观点(若有误,请各位神友指点):
Windows下创建用户并授权与Linux下的命令,有一处不太相同
# 下面的,Win与Linux都一样 # 创建一个没有权限的用户 create user uson@localhost identified by '密码'; # 或者 create user uson@'%' identified by '密码'; # %在什么时候都要加引号'',前面的用户名可加可不加localhost也可加可不加 本条命令创建完,用户是没有任何权限的USAGE,不管是win还是linux,都不能给他再用下面的授权语句赋予权限,只能删除用户,没有权限,连回收权限revoke也不能用,所以这样创建用户是没有意义的。还有:没有权限,当然也不能远程操作 # 查看用户权限 show grants for uson@localhost; # 同创建时的一样 或 show grants for uson; # 同创建时的一样,%可以省略 # 授权 grant all privileges on *.* to uson@localhost; 或 grant all privileges on *.* to uson; # 删除 drop user uson; #注意点: #@%:它不包括localhost,有时可不写,用到%必须加引号,但如果是:@localhost,就必须写,不可省略 # 下面的,只有是Win以管理员身份运行才可以做的 .\mysql -uroot -p密码 use mysql; grant all privileges on *.* to uson@localhost; show grants for uson@localhost; # 即使是root登录,连接远程的mysql,也没有权限,修改不了,即只能是本地的mysql,参考下图 .\mysql -h 192.168.1.6 -uroot -p密码 # 管理员身份这个特殊,-h与ip之间必须有空格
参考(H):
实例代码1:
扫描二维码关注公众号,回复:
7940305 查看本文章
#!/usr/bin/env python # Author:uson # -*- coding:utf-8 -*- import pymysql #创建连接 #VMware(必须是直连物理网络的桥接模式): #sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf bind-address=127.0.0.1--->0.0.0.0 配置 #sudo service mysql restart # conn = pymysql.connect(host="192.168.1.2", port=3306, user="root", passwd="123", db="usondb") # win本地 # conn = pymysql.connect(host="localhost", port=3306, user="root", passwd="123") conn = pymysql.connect(host="192.168.1.4", port=3306, user="root", passwd="123", db="usondb") #创建游标:默认游标是元组类型 cursor = conn.cursor() # 游标设置为字典类型 #cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #r = cursor.execute("call student()") # 过渡命令 # cursor.execute("use usondb") #等同于db="usondb" # sffect_row = cursor.execute("show tables") # print("sffect_row", sffect_row) #执行SQL,并返回受影响行数 # sffect_row = cursor.execute("update student set job='班主任' where id=3") #effect_row = cursor.execute("update hosts set job='班主任' where id > %s", (1,)) sffect_row = cursor.execute("select * from student") # print(sffect_row) # 条数 # print(cursor.fetchone()) #打印结果:具体数据(一行:类似于读文件) # print(cursor.fetchmany(3)) # 获取前n行数据 print(cursor.fetchall()) #打印结果:具体数据(所有行,根据现在实时的光标位置判断具体多少行) conn.commit() #提交 默认开启了事务 cursor.close() #关闭游标 conn.close() #关闭连接
实例代码2:
#!/usr/bin/env python # Author:uson # -*- coding:utf-8 -*- import pymysql conn = pymysql.connect(host='192.168.1.4', port=3306, user="uson", passwd='123', db='usondb') cursor = conn.cursor() '''下面这行写法,过于复杂,繁琐,不建议使用''' # cursor.executemany("insert into student(name, age, register_date, job, sex, born, addr) values(%s,%s,%s,%s,%s,%s,%s)",[('Yu', 3, '2017-10-27', 'sport', 'M', 'Luan', 'Luan')]) '''建议写法''' data = [ ('Hong', 1, '2017-10-25', 'play', 'M', 'Shanghai', 'Shanghai'), ('Qi', 2, '2017-10-26', 'eat', 'M', 'luan', 'luan'), ('QiYu', 3, '2017-10-27', 'cry', 'M', 'Beijing', 'Beijing'), ] cursor.executemany("insert into student(name, age, register_date, job, sex, born, addr) values(%s, %s, %s, %s, %s, %s, %s)", data) '''born报错:dataerror,类型是枚举的,不能任意''' '''这里:data前不能用%,用,''' conn.commit() cursor.close() conn.close() #获取最新自增ID new_id = cursor.lastrowid print("New_id:", new_id)
拓展:
注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:
- cursor.scroll(1,mode='relative') # 相对当前位置移动
- cursor.scroll(2,mode='absolute') # 相对绝对位置移动
4、fetch数据类型
关于默认获取的数据是元祖类型,如果想要或者字典类型的数据,即:
#!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1') # 游标设置为字典类型 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) r = cursor.execute("call p1()") result = cursor.fetchone() conn.commit() cursor.close() conn.close()