python之路_数据备份及pymysql模块

一、mysql数据备份与恢复

(一)数据库的备份与恢复

  数据库备份的语法如下:

mysqldump -h 服务器 -u用户名 -p密码 --database(databases) 数据库名 > 备份文件.sql

1、单数据库的备份与恢复

  数据库的备份:

  数据库的恢复:

2、多数据库的备份与恢复

  数据库的备份:

  数据库的恢复:

3、所有数据库的备份与恢复

  数据库的备份:

  数据库的恢复:

  总结:通过上述实例讲解可以看出,备份语法中使用的是大于号,大于号右侧即为指定生成的sql文件的路径,无论单数据库还是多数据库的备份,最终都只生成一个.sql文件,所以三种情况的数据库的恢复语法是一样的,语法中小于号右侧即是备份的.sql文件的路径。

 (二)表的备份与恢复

  也可以对一个数据库下的一个或者多个表进行备份,备份与恢复必须指定数据库,表的备份语法如下:

mysqldump -h 服务器 -u用户名 -p密码  数据库名  表名1 表名2...> 备份文件.sql

  备份表:

  恢复表:

(三)表的导入与导出

在执行表的导出的时候可能会报“'secure_file_priv' ”错误,原因为:数据库最关键的是数据,一旦数据库权限泄露,那么通过下述语句就可以轻松将数据导出到文件中然后下载拿走,因而mysql对此作了限制,只能将文件导出到指定目录:在配置文件中[mysqld]下配置目录,如:secure_file_priv='C:\\' #只能将数据导出到C:\\下

1、表的导出

mysql> select * from school.student1
into  outfile 'student1.txt'
fields terminated by  ','     #定义字段分隔符
optionally enclosed by ''    #定义字符串使用什么符号括起来
lines terminated by '\n' ;    #定义换行符

2、表的导入

mysql> load data infile 'student1.txt'
INTO TABLE school.student1
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY ''
LINES TERMINATED BY '\n';

ps:数据库的迁移

务必保证在相同版本之间迁移
# mysqldump -h 源IP -uroot -p123 --databases db1 | mysql -h 目标IP -uroot -p456

二、pymysql模块

下例中均使用右图所示的登录数据

                                  

 

 

 

 

1、建立连接及sql语句执行

import pymysql

# 获取用户输入
username = input("输入用户名:")
pwd = input("请输入密码:")


# 连接数据库检索有没有该用户
conn = pymysql.connect(
    host="localhost",
    port=3306,
    database="userinfo",
    user="root",
    password="123",
    charset="utf8"
)

cursor = conn.cursor()  # 获取光标
# 拼接要执行的SQL语句
sql = "select * from info where username='%s' and password='%s'" % (username, pwd)
print(sql)
print("=" * 120)
# 执行SQL语句
ret = cursor.execute(sql)
if ret:
    print("登录成功")
else:
    print("登录失败!")
# 关闭光标对像
cursor.close()
# 关闭连接
conn.close()

 

2、execute()之sql注入

(1)背景介绍

  在sql语句中,如果存在--字符,则执行sql语句时会注释掉--字符后面的内容。

a .绕过登录密码情况:

  如上述输入,sql语句如下:

sql=select * from egon where name='egon1' -- afsaj and password='ajdkh';

  执行此sql语句时,--后面的内容就会被注释掉,从而绕过验证密码部分的内容。

 b.绕过用户名和密码情况:

  如上述输入,sql语句如下:

sql=select * from egon where name='adsaj' or 1=1 -- ajdha and password='auddh';

  执行此sql语句时,绕过了密码的验证同时,即使用户名也错误,1=1总是成立的。

(2)解决办法

  上例展示这种我们自己通过拼接sql语句形式很不安全,通过excute()拼接可以解决此问题,实例如下:

import pymysql

# 获取用户输入
username = input("输入用户名:")
pwd = input("请输入密码:")


# 连接数据库检索有没有该用户
conn = pymysql.connect(
    host="localhost",
    port=3306,
    database="userinfo",
    user="root",
    password="123",
    charset="utf8"
)

cursor = conn.cursor()  # 获取光标
# 拼接要执行的SQL语句
sql = 'select * from info where username=%s and password=%s'
print(sql)
print("=" * 120)
# 执行SQL语句
ret = cursor.execute(sql, [username, pwd])  # 让pymysql帮我们拼接SQL语句
if ret:
    print("登录成功")
else:
    print("登录失败!")
# 关闭光标对像
cursor.close()
# 关闭连接
conn.close()

 3、增删改.

 通过占位符,可以实现插入一条或者多条信息情况。

a.用execute()插入一条信息

"""
pymysql增操作
"""

import pymysql

conn=pymysql.connect(
    host='localhost',
    port=3306,
    database='userinfo',
    user='root',
    password='123',
    charset='utf8'
)
cursor=conn.cursor()
# 拼接执行语句
sql="insert into info(username, password) VALUES (%s,%s)"
# 执行
try:
    cursor.execute(sql,['大旭','dadada'])
    # 对数据库做写操作一定要记得提交
    conn.commit() # 提交操作
except Exception as e:
    print(e)
    conn.rollback() # 回滚


cursor.close()
conn.close()

b.用executemany()插入多条信息

import pymysql

conn = pymysql.connect(
    host="localhost",
    port=3306,
    database="userinfo",
    user="root",
    password="123",
    charset="utf8"
)

cursor = conn.cursor()
# 创建班级的sql语句
sql = "insert into info (username, password) VALUES (%s, %s)"

data = [("alex1", "dashabi"), ("污Sir1",), ("xiaoyima1", "nvshen")]
try:
    cursor.executemany(sql, data)  # 内部实现for循环,批量执行插入语句
    # for i in data:
    #     cursor.execute(sql, i)
    conn.commit()  # 提交一次
except Exception as e:
    print("错啦!")
    conn.rollback()

cursor.close()
conn.close()

 4、查fetchone、fetchmany、fetchall  

  -- 上述cur=conn.cursor()游标默认查询得到结果以元组显示,通过设置可以以字典显示,如下:.

import pymysql

conn = pymysql.connect(
    host="localhost",
    port=3306,
    database="userinfo",
    user="root",
    password="123456",
    charset="utf8"
)

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 指定返回的数据格式为字典格式

sql = "select * from info"

cursor.execute(sql)  # 返回的不是具体的数据而是受影响的行数
# ret = cursor.fetchall()  # 返回所有的数据
# ret = cursor.fetchone()  # 返回第一条的数据
# print(ret)
# ret = cursor.fetchone()  # 返回一条的数据
# print(ret)
# ret = cursor.fetchone()  # 返回一条的数据
# print(ret)
# ret = cursor.fetchone()  # 返回一条的数据
# print(ret)
# ret = cursor.fetchone()  # 返回一条的数据
# print(ret)
# ret = cursor.fetchone()  # 返回一条的数据
# print(ret)
# ret = cursor.fetchone()  # 返回一条的数据
# print(ret)

ret = cursor.fetchmany(3)  # 查询具体多少条数据
print(ret)
# cursor.scroll(0, mode="absolute")  # 绝对移动,写多少就是移到多少
cursor.scroll(-1, mode="relative")
ret = cursor.fetchall()
print(ret)
cursor.close()
conn.close()

5、获取最后一条数据的自增ID

import pymysql

conn = pymysql.connect(
    host="localhost",
    port=3306,
    database="userinfo",
    user="root",
    password="123",
    charset="utf8"
)

cursor = conn.cursor()
# 创建班级的sql语句
sql1 = "insert into class (name) VALUES (%s)"
# 创建学生的sql语句
sql2 = "insert into student (name, cid) VALUES (%s, %s)"


cursor.execute(sql1, "全栈9期")
new_id = cursor.lastrowid  # 获取刚插入数据的ID值
cursor.execute(sql2, ["小东北", new_id])

conn.commit()
cursor.close()
conn.close()

 

posted @ 2018-12-27 04:29  时间的侵蚀  阅读(50)  评论(0)    收藏  举报