zoukankan      html  css  js  c++  java
  • python操作数据库

     


     数据库编程

    从前面我们知道数据库概念包含 数据库文件、服务器和数据库客户端 客户端我们之前已经用过的有navicat/mysql-client等程序。

    问题: 如何使用客户端将100000行数据插入到数据库?

    大家会发现如果用之前客户端几乎是不可能完全这个任务的, 因为我们不可能去构造出那个插入10w行数据的SQL。可是,如果我们有一个功能能够插入一行数据,借助程序强大的特点-重复,就可以轻而易举的就将10w行数据收入麾下。这种通过使用程序代码的方式去连接数据库服务器,通过和服务器进行交互完成对数据库的增删改查的方式,就称为数据库编程。

    而此刻学习的pymysql就是一种客户端。

     Python 中操作 MySQL 步骤

    如何理解连接 connection 和 游标 cursor connection就像是连接出发地和目的地的 高速公路 cursor就像是在高速公路上的货车-拉货 我们使用游标就可以完成对数据的操作 当我们完成操作完成后就可以停下货车,然后公路再停止使用。

    pymysql的使用

    引入模块

    from pymysql import connect
    

    Connection 对象

    • 用于建立与数据库的连接 调用pymysql模块中的connect()方法
    conn=connect(参数列表)
    
    * 参数host:连接的mysql主机,如果本机是'localhost'
    * 参数port:连接的mysql主机的端口,默认是3306
    * 参数database:数据库的名称
    * 参数user:连接的用户名
    * 参数password:连接的密码
    * 参数charset:通信采用的编码方式,推荐使用utf8
    
    • 关闭连接 conn.close()

    • 提交数据 conn.commit()

    • 撤销数据 conn.rollback()

    • 通过连接获取游标 cur = conn.cursor()返回Cursor对象,用于执行sql语句并获得结果

    Cursor游标对象

    • 获取Cursor对象

        # 调用Connection对象的cursor()方法    
        cur =conn.cursor()
      

    目的: 执行sql语句(使用频度最高的语句为select、insert、update、delete)

    • 使用游标执行SQL语句

    execute(operation [, parameters ]) 执行SQL语句,返回受影响的行数,主要用于执行insert、update、delete语句,也可以执行create、alter、drop等语句

    • 关闭游标 cur.close()
    • 获取结果集中的一条

      cur.fetchone()返回一个元组 形如 (1,'妲己',18)

    • 获取结果集中的所有

      cur.fetchall()执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回 形如((1,'公孙离',20),(2,'妲己',18))

    pymysql完成数据查询

    import pymysql
    
    # 创建和数据库服务器的连接 服务器地址   端口    用户名     密码  数据库名 通信使用字符和数据库字符集一致
    conn = pymysql.connect(host='localhost', port=3306, user='root', password='mysql',database='python_test_1', charset='utf8')
    
    # 获取游标
    cursor = conn.cursor()
    
    # 执行SQL语句 返回值就是SQL语句在执行过程中影响的行数
    sql = """select * from hero;"""
    
    row_count = cursor.execute(sql)
    print("SQL语句执行影响的行数%d" % row_count)
    
    # 取出结果集中一行  返回的结果是一行 (1, '妲己', 2)
    # print(cursor.fetchone())
    
    # 取出结果集中的所有数据  返回 ((一行数据),(),())
    # ((1, '妲己', 2), (2, '李白', 1), (3, '程咬金', 3), (4, '亚瑟', 5), (5, '荆轲', 99))
    for line in cursor.fetchall():
        print(line)
    
    # 关闭游标
    cursor.close()
    
    # 关闭连接
    conn.close()
    

    pymysql完成对数据库的增删改

    import pymysql
    
    conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='mysql',db='python_test_1', charset='utf8')
    
    # 通过连接获取游标
    cursor = conn.cursor()
    
    
    # sql = "delete from hero where id = 5;"
    # sql = insert into hero (name) values ('西部大坏蛋孙悟空');
    sql = "update hero set kongfuid=444 where id = 4;"
    
    row_count = cursor.execute(sql)
    print("SQL语句执行影响的行数%d" % row_count)
    
    # 提交数据到数据库
    # conn.commit()
    
    # 回滚数据到什么都不做的状态 即撤销刚刚的修改
    conn.rollback()
    
    # 关闭游标和连接
    cursor.close()
    conn.close()
    

    关于提交commit commit将修改提交到数据库,保存修改

    注意pymysql中数据需要手动提交commit才能保存到数据库中

    参数化列表防止SQL注入

    什么是SQL注入 产生原因: 后台将用户提交的带有恶意的数据和SQL进行字符串方式的拼接,从而影响了SQL语句的语义,最终产生数据泄露的现象。 如果防止: sql语句的参数化, 将SQL语句的所有数据参数存在一个列表中传递给execute函数的第二个参数

    注意

    * 此处不同于python的字符串格式化,必须全部使用%s占位
    * 所有参数所需占位符外不需要加引号
    
    
    from pymysql import connect
    
    def main():
    
        find_name = input("请输入物品名称:")
    
        # 创建Connection连接
        conn = connect(host='localhost',port=3306,user='root',password='mysql',database='jing_dong',charset='utf8')
        # 获得Cursor对象
        cs1 = conn.cursor()
    
    
        # # 非安全的方式
        # # 输入 " or 1=1 or "   (双引号也要输入)
        # sql = 'select * from goods where name="%s"' % find_name
        # print("""sql===>%s<====""" % sql)
        # # 执行select语句,并返回受影响的行数:查询所有数据
        # count = cs1.execute(sql)
    
        # 安全的方式
        # 构造参数列表 
        params = [find_name]
        # 执行select语句,并返回受影响的行数:查询所有数据
        count = cs1.execute('select * from goods where name=%s', params)
        # 注意:
        # 如果要是有多个参数,需要进行参数化
        # 那么params = [数值1, 数值2....],此时sql语句中有多个%s即可 
    
        # 打印受影响的行数
        print(count)
        # 获取查询的结果
        # result = cs1.fetchone()
        result = cs1.fetchall()
        # 打印查询的结果
        print(result)
        # 关闭Cursor对象
        cs1.close()
        # 关闭Connection对象
        conn.close()
    
    if __name__ == '__main__':
        main()
  • 相关阅读:
    BestCoder17 1001.Chessboard(hdu 5100) 解题报告
    codeforces 485A.Factory 解题报告
    codeforces 485B Valuable Resources 解题报告
    BestCoder16 1002.Revenge of LIS II(hdu 5087) 解题报告
    codeforces 374A Inna and Pink Pony 解题报告
    codeforces 483B Friends and Presents 解题报告
    BestCoder15 1002.Instruction(hdu 5083) 解题报告
    codeforces 483C.Diverse Permutation 解题报告
    codeforces 483A. Counterexample 解题报告
    NSArray中地内存管理 理解
  • 原文地址:https://www.cnblogs.com/serpent/p/9427901.html
Copyright © 2011-2022 走看看