zoukankan      html  css  js  c++  java
  • 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 '
    ' ;    #定义换行符

    2、表的导入

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

    ps:数据库的迁移

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

    二、pymysql模块

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

                                      

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

    import pymysql
    name=input('>>>').strip()
    pswd=input('>>>').strip()
    '''建立连接conn'''
    conn=pymysql.connect(
        host='localhost',
        user='root',
        password='',
        database='egon',
        charset='utf8'
    )
    '''获取游标cur'''
    cur=conn.cursor()
    sql='select * from userinfo where name="%s" and password="%s";' %(name,pswd)  #占位符必须用双引号
    res=cur.execute(sql)                                                          #执行SQL语句,返回sql查询成功的记录数目
    print(res)
    cur.close()     #关闭游标
    conn.close()    #关闭连接
    
    if res:
        print('登录成功')
    else:
        print('登录失败')

    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
    name=input('name:').strip()
    pswd=input('password:').strip()
    '''建立连接conn'''
    conn=pymysql.connect(
        host='localhost',
        user='root',
        password='',
        database='egon',
        charset='utf8'
    )
    '''获取游标cur'''
    cur=conn.cursor()
    sql='select * from userinfo where name=%s and password=%s;' #注意%s不需要引号,因为pymysql会自动为我们加上
    res=cur.execute(sql,(name,pswd))                            #拼接的内容可以是元组也可以是列表,但必须按顺序输入
    print(res)
    cur.close()     #关闭游标
    conn.close()    #关闭连接
    
    if res:
        print('登录成功')
    else:
        print('登录失败')

    3、增删改

    import pymysql
    conn=pymysql.connect(host='localhost', user='root',password='',database='egon',charset='utf8')
    cur=conn.cursor()
    sql='insert into userinfo(name,password) values("alex","123");'
    res=cur.execute(sql)    #res为影响的行数,结果为1
    print(res)
    conn.commit()           #提交后才发现表中插入记录成功
    cur.close()
    conn.close()

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

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

    import pymysql
    conn=pymysql.connect(host='localhost', user='root',password='',database='egon',charset='utf8')
    cur=conn.cursor()
    sql='insert into userinfo(name,password) values(%s,%s);' #占位符不需要引号
    res=cur.execute(sql,('yuan','123'))   
    print(res)                                               #res为影响的行数,结果为1
    conn.commit() #提交后才显示插入的数据
    cur.close()
    conn.close()

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

    import pymysql
    conn=pymysql.connect(host='localhost', user='root',password='',database='egon',charset='utf8')
    cur=conn.cursor()
    sql='insert into userinfo(name,password) values(%s,%s);'
    res=cur.executemany(sql,[('yuan','123'),('xxx','asah'),('yyy','asyd')])
    print(res)    #res为影响的行数,结果为3
    conn.commit()  #提交后才显示插入的数据
    cur.close()
    conn.close()

    4、查fetchone、fetchmany、fetchall

    import pymysql
    conn=pymysql.connect(host='localhost', user='root',password='',database='egon',charset='utf8')
    cur=conn.cursor()
    sql='select * from userinfo'
    res=cur.execute(sql)                                                   #执行sql语句,返回sql影响成功的行数rows,将结果放入一个集合,等待被查询
    # cursor.scroll(3,mode='absolute') # 相对绝对位置移动
    # cursor.scroll(3,mode='relative') # 相对当前位置移动
    res1=cur.fetchone()                                                    #查询一条
    res2=cur.fetchmany(2)                                                  #查询多条,如2条
    res3=cur.fetchall()                                                    #查询所有
    print(res1)                                                            #(1, 'egon1', '123')
    print(res2)                                                            #((2, 'egon2', '123'), (3, 'egon3', '123'))
    print(res3)                                                            #((4, 'egon4', '123'), (5, 'egon5', '123'))
    
    conn.commit()
    cur.close()
    conn.close()

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

    import pymysql
    conn=pymysql.connect(host='localhost', user='root',password='',database='egon',charset='utf8')
    cur=conn.cursor(cursor=pymysql.cursors.DictCursor)#设置查询结果以字典形式显示
    sql='select * from userinfo'
    res=cur.execute(sql)
    res1=cur.fetchone()
    res2=cur.fetchmany(2)
    res3=cur.fetchall()
    print(res1)   #{'id': 1, 'name': 'egon1', 'password': '123'}
    print(res2)   #[{'id': 2, 'name': 'egon2', 'password': '123'}, {'id': 3, 'name': 'egon3', 'password': '123'}]
    print(res3)   #[{'id': 4, 'name': 'egon4', 'password': '123'}, {'id': 5, 'name': 'egon5', 'password': '123'}]
    conn.commit()   #提交后才会显示插入的内容
    cur.close()
    conn.close()

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

    import pymysql
    conn=pymysql.connect(host='localhost',user='root',password='',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()
  • 相关阅读:
    C# 显式创建线程 or 使用线程池线程--new Thread() or ThreadPool.QueueUserWorkItem()
    B树、B-树、B+树、B*树详解
    C# Volatile 类
    volatile(C# 参考)
    C#中volatile的用法
    C#编程总结(六)异步编程
    C#编程总结(五)多线程带给我们的一些思考
    C#编程总结(三)线程同步
    C#编程总结(二)多线程基础
    C#编程总结(一)序列化
  • 原文地址:https://www.cnblogs.com/seven-007/p/7756687.html
Copyright © 2011-2022 走看看