对于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:
#!/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()