day60 pymysql

预知扩展内容,详见地址如下(关于数据库备份和恢复)

   http://www.cnblogs.com/linhaifeng/articles/7525619.html

我们一般写程序都是在py文件里面,那么当我们需要跟数据库连接的时候,如果在另外开启一个数据库系统的话就会很费时费力,这个时候我们的pycharm就给我们提供了这种便利,就是使用pycharm来连接我们的数据库系统,然后进行操作,直接使用pycharm一个程序就可以了,方便快捷,我们的一切行为以提高工作效率为宗旨.所以要善用工具

我们先要在我们的pycharm里面下载一个pycharm模块,然后再py文件的顶部引用这个模块就可以投入使用了,[这里需要注意的是我们在pycharm3版本里面使用的是pymycql这个模块,

而在pycharm2版本里面使用的是mysqldb这个模块,这是e2和3的区别]

 我们先来看一下在pycharm里面如何来调出mysql的窗口来

如图所示:

在上图中我们可以看到databases这个按钮,这里就是我们的mysql数据库窗口,点进去就可以看到我们之前在mysql的辅助工具里面的看到的类似的页面,然后就能根据提示操作了,

在这里操作完之后需要根据提示有一个用户名和密码的输入框,需要授权之后才可以访问数据库.

这里点击之后我们就可以调出执行面板

执行面板就长这样:

然后就可以根据需求我们把库/表格进行新建,修改,查询等操作建立或者修改完成后记得提交,在这里进行提交操作:

接下来就是一些python和mysql相结合的时候我们需要注意的一些语法问题,

然后 就是对数据库进行操作

首先是引入模块,import pymysql

然后就是建立连接,就像我们在网络编程里面服务端和客户端建立的连接一样的,需要绑定IP和端口,在这里我们需要绑定的不仅仅是IP和端口这两项,还有其他的参数都需要绑定,

conn=pymysql.connect(host="localhost",database="book_list",user="root",password="123",charset="utf8")  我们的端口是默认的3306,一般不写出来,可以写出来,

我们这里的conn是固定的变量,=是赋值,没什么好难理解的,

pymysql是模块,我们引入的模块,必须要写上,.connect是连接,也是固定的,就像客户端和服务端建立连接的时候一样用.connect来操作,然后就是括号里面的参数了,

host是IP地址,我们使用自己本地的就直接用localhost,

database是数据库的名字,

user是授权用户账户名

password是授权用户的密码

charset是字符编码,我们一般都是设定成为utf8[这一句是必须要加上的,否则取出来的sql语句里面如果有中文的话会出现乱码,这个参数是必须要加上的]

我们在mysql里面使用数据库的时候会有一个光标一直在闪烁提示我们输入命令,然后我们输入命令之后就可以得出结果,所以我们在python里面连接上数据库之后还需要获取这个光标然后我们就可以输入sql命令了

caa = conn.cursor() 这里我们使用的从你这个变量然后调用cursor这个方法就能够获取到这个光标,而=右边这个变量名字是随意起的,改成abc=conn.cursor()也是没有问题的

 

紧接着我们就要开始着手写sql语句了,

sql = "show databases;"

ret = caa.execute(sql)   我们在这里执行了上面的sql语句,要用到执行的语法---->execute()括号里面是需要执行的提前存好的sql语句赋值的变量,执行前需要使用到光标获取所赋值的变量

caa.close()  我们需要把光标关闭

conn.close()  然后再关闭掉连接 [就像我们在客户端和服务端需要关闭的网络连接是一样的]

print(ret)  这里我们打印出来最终的结果

接下来就是数据库的增删改查操作了,都是比较简单基础的东西,我们之前的mysql里面都讲过了,只是牵扯到了一些

python里面的语法,写的时候有些格式的问题,但是那些都比较简单,然后我们写几个例子也就记住了.基本套路就是上面的那些,

增:

按照上面的套路来,我们举一个增加内容的例子,

# 导入模块
import pymysql
# 连接database
conn = pymysql.connect(host="IP地址",user="用户名",password="密码",database="库名",charset="utf8")
# 得到一个可以执行的sql语句的光标对象
cu = conn.cursor()
# 定义要执行的sql语句
sql = "insert into userinfo(name,age) values (%s, %s);''
username = "alex"
age = 18
# 执行sql语句
cu.execute(sql, [username, age])
# 提交事物
conn.conmit()
cu.close()
conn.close()





数据回滚事件
导入模块
import pymysql
# 连接database
conn = pymysql.connect(host="ip地址", user="用户名", password="密码", database="库名",charset="utf8")
# 得到一个可以执行sql语句的光标对象
cur = conn.cursor()
sql = "insert into user158(name, age) values (%s, %s);"
username = "alex"
age = 90
try:
    # 执行sql语句
    cur.execute(sql, [username, age])
    # 提交事物  这里跟我们mysql里面学过的事物是一样的,sql没有问题就# 执行提交操作
    conn.commit()
except Exception as e:
    # 有异常, 回滚事物,如果有异常的话就直接回滚了,不会提交事物
    conn.rollback()
cur.close()
conn.close()


# 导入pymysql模块
import pymysql
# 连接database
conn = pymysql.connect(host="localhost", database="book_list", user="root", password="123", charset="utf8")
# 得到一个可以执行SQL语句的光标对象
cursor = conn.cursor()
sql = "INSERT INT[]O userinfo(pwd, name) VALUES (%s, %s);" # 这里我们设定一个不成立的sql语句,所以我们会捕捉这里的异常然后回滚它,如果设定一个成立的sql,那么我们就可以提交它
pwd = "Alex"
name = "alex"
try:
# 执行SQL语句
cursor.execute(sql, [pwd, name])
# 提交事务
conn.commit()
# 提交之后,获取刚插入的数据的ID
last_id = cursor.lastrowid
except Exception as e:
# 有异常,回滚事务
conn.rollback()
cursor.close()
conn.close()
# print(last_id)


批量执行操作:
批量执行

# 导入pymysql模块
import pymysql
# 连接database
conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
# 得到一个可以执行SQL语句的光标对象
cursor = conn.cursor()
sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);"  
data = [("Alex", 18), ("Egon", 20), ("Yuan", 21)]  # 我们在这里传入多个数据,用元祖或者列表的形式
try:
    # 批量执行多条插入SQL语句
    cursor.executemany(sql, data)
    # 提交事务
    conn.commit()
except Exception as e:
    # 有异常,回滚事务
    conn.rollback()
cursor.close()
conn.close()
 删:


# 导入pymysql模块
import pymysql
# 连接database
conn = pymysql.connect(host="localhost", database="book_list", user="root", password="123", charset="utf8")
# 得到一个可以执行SQL语句的光标对象
cursor = conn.cursor()
# sql = "INSERT INT[]O userinfo(pwd, name) VALUES (%s, %s);"
# pwd = "Alex"
# name = "alex"
sql = "delete from userinfo where id=%s;"
try:
# 执行SQL语句
cursor.execute(sql, [1])
# 提交事务
conn.commit()
# 提交之后,获取刚插入的数据的ID
except Exception as e:
# 有异常,回滚事务
conn.rollback()
cursor.close()
conn.close()


改:

# 导入pymysql模块
import pymysql
# 连接database
conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
# 得到一个可以执行SQL语句的光标对象
cursor = conn.cursor()
# 修改数据的SQL语句
sql = "UPDATE userinfo SET age=%s WHERE name=%s;"
username = "Alex"
age = 80
try:
# 执行SQL语句
cursor.execute(sql, [age, username])
# 提交事务

conn.commit()
except Exception as e:
# 有异常,回滚事务
conn.rollback()
cursor.close()
conn.close()

查:

import pymysql
conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
cursor = conn.cursor()
sql = "SELECT id,name,age from USER1 WHERE id=1;"
cursor .execute(sql)
ret = cursor.fetchone()  # 获取单挑数据
# ret = cursor.fetchall() # 获取所有数据,得到的是一个元祖
# ret = cursor.fetchmany(2) # 括号里面是自定义的数字,指定获取几条数据
cursor.close()
conn.close()
print(ret)

光标按照绝对/相对位置移动

import pymysql

# 连接
conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8")  # 没有-
# 获取光标
cursor = conn.cursor()
# 写sql语句
sql = "select * from userinfo;"

# 执行SQL语句
ret = cursor.execute(sql)
print("-->",ret)
# 一次取一条
# print(cursor.fetchone())
# print(cursor.fetchone())
# print(cursor.fetchone())
# 一次取所有
# print(cursor.fetchall())
# 一起取三条
# print(cursor.fetchmany(3))

# 进阶用法
print(cursor.fetchone())
print(cursor.fetchall())
print(cursor.fetchone())
# 移动取数据的光标
cursor.scroll(-2)  # 默认是相对移动
print(cursor.fetchone())
# 按照绝对位置去移动
cursor.scroll(4, mode="absolute")
print(cursor.fetchone())
cursor.close()
conn.close()

 按照绝对位置移动是没有什么好理解的,就是从第一条数据开始作为起点,在它的基础上进行移动

而我们用得最多的不是绝对位置,而是相对位置

这里是一些例子,可以便于我们理解:

import pymysql
conn = pymysql.connect(
    host="localhost",
    user="root",
    database="book_list",
    password="123",
    charset="utf8"
)

abc = conn.cursor()

sql = "select id, pwd, name from userinfo;"

abc.execute(sql)

# print("---->", ret)
# abc.scroll(0)  # 我们这里的索引值是从0开始的,
# 也就是说我们的第一行数据的索引值是0,第二行的索引值是1,而第三行的索引值是2依次类推
# print(abc.fetchone())
# print(abc.fetchone())
# print(abc.fetchmany(2))
# print(abc.fetchall())
# abc.scroll(4)  # 这里是相对于我们的光标目前所在的位置进行移动的,
# print(abc.fetchone())
# print(abc.fetchmany(2))
# print(abc.fetchall())
# abc.scroll(-4)  # 我们的程序走到这一步的时候我们已经把所有的数据都取出来了,
# 这个时候把光标移动到当前位置(也就是末尾的位置的时候)的相对位置,
# 就是相当于在末尾的位置的基础上-4的位置,也就是从下往上移动了4个格,就到了倒数第4个位置上面,然后就可以接着去取值了
# print(abc.fetchone())
# print(abc.fetchall())
abc.scroll(1)
print(abc.fetchone())
abc.scroll(2)
print(abc.fetchone())
abc.scroll(-3)
print(abc.fetchone())
abc.scroll(2)
print(abc.fetchone())
abc.close()
conn.close()
View Code

我们先定义一个scroll(2)

然后fetchone()得到一个数据,看看它所在的位置,假设它是a

再定义一个scroll(3)

fetchone()得到一个数据,这个时候就可以得出对比的结果了,我们要这样去举例子才能明白怎么回事,

这里的结果假设它是b,就是我们在上面的scroll(2),fetchone()得到的a的基础上再进行移动,移动了3个数据的位置,才得到这里的b

这里就是相对移动,我们不传参数的话就是默认相对位置移动,

总结,我们的相对位置移动这样更加灵活,比如我们取数据的时候取到了第4条,然后想返回去取第2条的时候就把光标-2移动到第二条就可以了,这样更加灵活

获取插入的最后一条数据的自增id使用

lastrowid方法
如下例:
import pymysql
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')
cursor=conn.cursor()

sql='insert into userinfo(name,password) values("xxx","123");'
rows=cursor.execute(sql)
print(cursor.lastrowid) #在插入语句后查看

conn.commit()

cursor.close()
conn.close()

pymysql的权限管理操作:



#授权表
user #该表放行的权限,针对:所有数据,所有库下所有表,以及表下的所有字段
db #该表放行的权限,针对:某一数据库,该数据库下的所有表,以及表下的所有字段
tables_priv #该表放行的权限。针对:某一张表,以及该表下的所有字段
columns_priv #该表放行的权限,针对:某一个字段

#按图解释:
user:放行db1,db2及其包含的所有
db:放行db1,及其db1包含的所有
tables_priv:放行db1.table1,及其该表包含的所有
columns_prive:放行db1.table1.column1,只放行该字段
#创建用户
create user 'egon'@'1.1.1.1' identified by '123';
create user 'egon'@'192.168.1.%' identified by '123';
create user 'egon'@'%' identified by '123';


#授权:对文件夹,对文件,对文件某一字段的权限
查看帮助:help grant
常用权限有:select,update,alter,delete
all可以代表除了grant之外的所有权限

#针对所有库的授权:*.*
grant select on *.* to 'egon1'@'localhost' identified by '123'; #只在user表中可以查到egon1用户的select权限被设置为Y

#针对某一数据库:db1.*
grant select on db1.* to 'egon2'@'%' identified by '123'; #只在db表中可以查到egon2用户的select权限被设置为Y

#针对某一个表:db1.t1
grant select on db1.t1 to 'egon3'@'%' identified by '123';  #只在tables_priv表中可以查到egon3用户的select权限

#针对某一个字段:
mysql> select * from t3;
+------+-------+------+
| id   | name  | age  |
+------+-------+------+
|    1 | egon1 |   18 |
|    2 | egon2 |   19 |
|    3 | egon3 |   29 |
+------+-------+------+

grant select (id,name),update (age) on db1.t3 to 'egon4'@'localhost' identified by '123'; 
#可以在tables_priv和columns_priv中看到相应的权限
mysql> select * from tables_priv where user='egon4'G
*************************** 1. row ***************************
       Host: localhost
         Db: db1
       User: egon4
 Table_name: t3
    Grantor: root@localhost
  Timestamp: 0000-00-00 00:00:00
 Table_priv:
Column_priv: Select,Update
row in set (0.00 sec)

mysql> select * from columns_priv where user='egon4'G
*************************** 1. row ***************************
       Host: localhost
         Db: db1
       User: egon4
 Table_name: t3
Column_name: id
  Timestamp: 0000-00-00 00:00:00
Column_priv: Select
*************************** 2. row ***************************
       Host: localhost
         Db: db1
       User: egon4
 Table_name: t3
Column_name: name
  Timestamp: 0000-00-00 00:00:00
Column_priv: Select
*************************** 3. row ***************************
       Host: localhost
         Db: db1
       User: egon4
 Table_name: t3
Column_name: age
  Timestamp: 0000-00-00 00:00:00
Column_priv: Update
rows in set (0.00 sec)

#删除权限
revoke select on db1.* from 'alex'@'%';

例如:
在cmd里面执行
revoke select,insert,delete,update *.* from 'root'@'192.168.15.13'
或者在navicat,pycharm里面都可以执行,加上;即可,
最后我们需要在任务管理器里面的服务里面找到mysql服务然后把它重启服务即可彻底解除绑定

权限相关操作
权限命令:


原文地址:https://www.cnblogs.com/2012-dream/p/8258617.html