MySQL进阶篇-Python交互

对于Python操作MySQL主要使用两种方式:

  • 原生模块 pymsql  -->pymsql支持python3.x,mysqldb仅支持python2.x
  • ORM框架 SQLAchemy  -->移步(点击跳转

原生模块 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):https://www.cnblogs.com/fslnet/p/3143344.html

实例代码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()

猜你喜欢

转载自www.cnblogs.com/uson/p/11566880.html