zoukankan      html  css  js  c++  java
  • pymysql的基本使用

    TOC

    当我们在写程序中需要使用到数据库的时候,尽量在代码层次实现一些限制,例如两张表,我们不再使用外键去关联表与表之间的关系,我们可以在程序层面修改其中的一张表,再去修改另一张表的数据,这样会减轻数据库的压力,代码层次可以实现的,就不要再去使用数据库。

    pymysql的语法

    import pymysql  # 下载并导入pymysql模块
    
    
    # 建立连接,并产生一个连接会话对象
    conn = pymysql.connect(
        user='root',
        password='123',
        host='127.0.0.1',
        port=3306,  # 注意:端口号不需要用引号引起来
        charset='utf8',
        database='db1'
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 产生一个游标对象
    # cursor=pymysql.cursors.DictCursor 将查询出来的结果制作成字典的形式返回
    # 若不加,则返回的是括号加数据,例如:(1, 张三),不会显示表中的字段,很不方便
    sql = 'select * from user_info'  # 语句后可不加分号,pymysql会自动添加
    res = cursor.execute(sql)  # 执行sql语句
    # print(res)  # execute返回的是当前sql语句所影响的行数,并不是查询结构
    # ret = cursor.fetchone()  # 只获取查询的结果中的一条数据
    # ret = cursor.fetchall()  # 获取查询结果的全部数据
    # ret = cursor.fetchmany(2)  # 获取指定行数的数据,如果数字超了,也不会报错
    # print(ret)
    print(cursor.fetchone())
    print(cursor.fetchone())  # 连续使用2次,并不会重复展示表中的第一条数据,执行一次取掉一次数据,执行第二次就取表中的第二行数据
    # 相对移动
    cursor.scroll(2, 'relative')  # 基于指针所在的位置 往后偏移
    
    # 绝对移动
    cursor.scroll(1, 'absolute')  # 基于起始位置,往后偏移

    sql注入问题

    利用特殊符号和注释语法 巧妙的绕过真正的sql校验

    关键性的数据 不要自己手动去拼接 而是交由execute帮你去做拼接

    采用手动拼接的情况

    import pymysql
    
    conn = pymysql.connect(
        user='root',
        password='123',
        host='localhost',
        port=3306,
        charset='utf8',
        database='db1'
    )
    
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    username = input('username>>').strip()
    password = input('password>>').strip()
    sql = "select * from user_info where name = '%s' and password = '%s'" % (username, password)
    # sql = 'select * from user_info where name = "%s" and password = "%s"' % (username, password)
    # select * from user_info where name = "张三' -- fhjkasdhfkla" and password = "" 外层使用单引号出不来效果
    print(sql)
    cursor.execute(sql)
    res = cursor.fetchall()
    if res:
        print(res)
    else:
        print('username or password error!')
    

    解决办法:

    交给pymysql中的execute进行处理

    import pymysql
    
    conn = pymysql.connect(
        user='root',
        password='123',
        host='localhost',
        port=3306,
        charset='utf8',
        database='db1'
    )
    
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    username = input('username>>').strip()
    password = input('password>>').strip()
    # sql = "select * from user_info where name = '%s' and password = '%s'" % (username, password)
    # sql = 'select * from user_info where name = "%s" and password = "%s"' % (username, password)
    # select * from user_info where name = "张三' -- fhjkasdhfkla" and password = "" 外层使用单引号出不来效果
    sql = "select * from user_info where name = %s and password = %s"
    print(sql)
    # cursor.execute(sql)
    cursor.execute(sql, (username, password))
    res = cursor.fetchall()
    if res:
        print(res)
    else:
        print('username or password error!')

    数据的增删查改

    尝试进行增操作:

    import pymysql
    
    conn = pymysql.connect(
        user='root',
        password='123',
        host='localhost',
        port=3306,
        charset='utf8',
        database='db1'
    )
    
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = 'insert into user_info(name, password) value("刘和平", 17)'
    res = cursor.execute(sql)
    print(res)

    让我们去表中看看,是否增加上去:

    显然,并没有新增一条数据。

    在pymysql中,如果进行增删改等操作,对于这些执行重要程度偏高的语句,需要有一步确认操作(commit):

    import pymysql
    
    conn = pymysql.connect(
        user='root',
        password='123',
        host='localhost',
        port=3306,
        charset='utf8',
        database='db1'
    )
    
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = 'insert into user_info(name, password) value("刘和平", 17)'
    res = cursor.execute(sql)
    conn.commit()  # 提交
    print(res)

    观察表中的数据:





  • 相关阅读:
    【Apollo】Apollo 分布式部署
    【Spring】SpringBatch快速入门
    Nacos、Apollo、Spring Cloud Config微服务配置中心对比
    IDEA或Android Studio用书签功能标识代码 Stars
    Jetpack架构组件学习(0)——总结篇 Stars
    Android Studio导出APP的数据库db文件 Stars
    Jetpack架构组件学习(1)——LifeCycle的使用 Stars
    JavaFx Tooltip悬浮提示使用及自定义 Stars
    JavaFx WebView使用研究 Stars
    Jetpack架构组件学习(2)——ViewModel和Livedata使用 Stars
  • 原文地址:https://www.cnblogs.com/cnhyk/p/12050763.html
Copyright © 2011-2022 走看看