• Python 操作 MySQL


    前期已学习MySQL的命令操作,现需使用Python对数据库进行操作,具体操作流程分为以下5步:

    创建数据库连接
    创建游标
    数据库操作
    关闭游标
    关闭连接

      首先,需要对游标有个大体概念;游标是数据库中用来存储数据处理位置的容器,游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果。 先有数据基础:游标是在先从数据表中检索出数据之后才能继续灵活操作的技术。 类似于指针:游标类似于指向数据结构堆栈中的指针,用来pop出所指向的数据,并且只能每次取一个。

      1、创建数据库连接

    Python创建数据库连接,需使用mysql包中的connect模块,首先需导入模块:

    from mysql import connect

    创建数据库连接:

    # 创建数据库连接需包含host、port、database、user、password、charset这6个参数,排序无要求
    conn = connect(host='localhost', port=3306, database='数据库名', user='数据库账户名', password='密码', charset='utf8')

      2、创建游标

    cur = conn.cursor()

      3、数据库操作

    # 数据库操作命令,建议使用三引号,以防命令中存在引号的情况。
    sql_str = '''select * from 数据表名称'''
    
    # 游标记录执行次数
    row_count = cur.execute(sql_str)
    print(row_count)
    
    # fetch命令用来取出命令执行结果
    row_one = cur.fetchone()
    # fetchone()为仅取出1条记录
    print(row_one)
    
    # fetchmany(n)括号内填入执行数量
    row_many = cur.fetchmany(4)
    # 以上结果为元祖形式,循环遍历并打印
    for t in row_many:
        print(t)
    
    # fetchall 执行取出所有剩下结果
    row_all = cur.fetchall()
    for t in row_many:
        print(t)

      4、关闭游标和连接,注意先后顺序

    cur.close()
    conn.close()

    参数化查询时需注意防止SQL注入问题

    # 拼接字段作为sql查询语句
    sql_str = ''' select * from 表名 where 字段名=%s''' % 搜索条件
    cur.execute(sql_str)
    fetch_all = cur.fetchall()
    for i in fetch_all:
        print(i)
    
    '''
    当搜索条件为'任意字符 or 1'时,sql执行前面任意字符后,继续执行or后面的1,sql中1为True,系统会自动输出所有该表格数据。
    '''
    
    # 参数化查询,防止注入问题
    sql_str = ''' select * from 表名 where 字段名=%s''' 
    cur.execute(sql_str, 搜索条件) # 搜索条件可为列表、元祖、字典等格式数据
    fetch_all = cur.fetchall()
    for i in fetch_all:
        print(i)
    
    '''
    当搜索条件为'任意字符 or 1'时,sql执行前面任意字符后,继续执行or后面的1,系统自动判断为异常,并抛出
    Warning: (1292, "Truncated incorrect DOUBLE value: '1 or 1'")
      result = self._query(query)
    的异常提醒。
    '''

    以上为查询数据操作,下面为连续代码实现数据库数据修改操作

    from mysql import connect
    
    
    conn = connect(host='localhost', port=3306, database='数据库名', user='用户名', password='密码', charset='utf8')
    cur = conn.cursor()
    
    sql_str = ''' insert into 表名(字段1, 字段2......) value(修改参数1, 修改参数2......) '''
    row_count = cur.execute(sql_str)
    
    # 修改操作需先提交
    conn.commit()
    
    cur.close()
    conn.close()

     下面为完成某货物清单数据库操作案例:

    首先需创建数据库

    create database JDDB charset utf8;

    按如下要求创建数据表

    # 创建goods表
    | goods | CREATE TABLE `goods` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(150) NOT NULL,
      `cate_id` int(10) unsigned NOT NULL,
      `brand_id` int(10) unsigned NOT NULL,
      `price` decimal(10,3) NOT NULL DEFAULT '0.000',
      `is_show` bit(1) NOT NULL DEFAULT b'1',
      `is_saleoff` bit(1) NOT NULL DEFAULT b'0',
      PRIMARY KEY (`id`),
      KEY `FK_cate_id` (`cate_id`),
      CONSTRAINT `FK_cate_id` FOREIGN KEY (`cate_id`) REFERENCES `goods_cates` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 |
    
    # 创建goods_cates表
    | goods_cates | CREATE TABLE `goods_cates` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(40) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 |
    
    # 创建goods_brands表
    | goods_brands | CREATE TABLE `goods_brands` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(40) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 |

    按以上规则创建完成后,可按自身要求插入数据

    from pymysql import connect
    
    
    class JD(object):
        def __init__(self):
            self.__conn = connect(host='localhost', port=3306, database='JDDB', user='root', password='mysql',
                                  charset='utf8')
            self.__cur = self.__conn.cursor()
    
        def run(self):
            while True:
                print("1查询所有商品信息")
                print("2查询所有商品在种类信息")
                print("3查询所有商品在品牌信息")
                print("4添加商品种类")
                print("5根据id查询商品信息")
                print("6根据id查询商品信息安全方式")
                select_id = input('请输入要进行的操作选项:')
    
                if select_id == '1':
                    self.__fetch_good()
    
                elif select_id == '2':
                    self.__fetch_cate()
    
                elif select_id == '3':
                    self.__fetch_brand()
    
                elif select_id == '4':
                    cate_name = input('请输入需添加的商品种类:')
                    self.__add_cate(cate_name)
    
                elif select_id == '5':
                    good_id = input('请输入需查找的商品id:')
                    self.__find_info(good_id)
    
                elif select_id == '6':
                    good_id = input('请输入需查找的商品id:')
                    self.__find_info_safe(good_id)
    
                else:
                    print('请输入合法操作!')
                    print('-'*50)
                    print('')
    
        def __show_info(self, fetch_all):
            for i in fetch_all:
                print(i)
            print('-'*50)
            print('')
    
        # 查询所有商品
        def __fetch_good(self):
            sql_str = '''select * from goods'''
            self.__cur.execute(sql_str)
            fetch_all = self.__cur.fetchall()
            self.__show_info(fetch_all)
    
        # 查询所有商品类目
        def __fetch_cate(self):
            sql_str = ''' select * from goods_cates'''
            self.__cur.execute(sql_str)
            fetch_all = self.__cur.fetchall()
            self.__show_info(fetch_all)
    
        # 查询所有商品品牌
        def __fetch_brand(self):
            sql_str = ''' select * from goods_brands'''
            self.__cur.execute(sql_str)
            fetch_all = self.__cur.fetchall()
            self.__show_info(fetch_all)
    
        # 添加商品类目
        def __add_cate(self, type):
            sql_str = '''insert into goods_cates(name) value(%s)'''
            self.__cur.execute(sql_str, (type,))
            self.__conn.commit()
        
        def __find_info(self, good_id):
            '''
            该方法中查询语句存在缺陷,可能出现SQL注入溢出 
            '''
            sql_str = ''' select goods.name,goods.price,gb.name,gc.name from goods inner join goods_brands gb inner join goods_cates gc on goods.brand_id=gb.id and goods.cate_id=gc.id where goods.id= %s''' % good_id
            self.__cur.execute(sql_str)
            fetch_all = self.__cur.fetchall()
            self.__show_info(fetch_all)
    
        # 按编号查询商品
        def __find_info_safe(self, good_id):
            sql_str = ''' select goods.name,goods.price,gb.name,gc.name from goods inner join goods_brands gb inner join goods_cates gc on goods.brand_id=gb.id and goods.cate_id=gc.id where goods.id= %s'''
            self.__cur.execute(sql_str, (good_id,))
            fetch_all = self.__cur.fetchall()
            self.__show_info(fetch_all)
    
        def __del__(self):
            '''
            程序执行结束后自动关闭游标及连接
            '''    
            self.__cur.close()
            self.__conn.close()
    
    
    def main():
        jd = JD()
        jd.run()
    
    
    if __name__ == '__main__':
        main()       

    该案例为展示Python实现SQL操作的简单项目,主要目的为简单展示实现方式及过程。

    Thought is already is late, exactly is the earliest time.
  • 相关阅读:
    UITableView学习笔记
    IOS基础之设置APP的名字、设置图标、添加等待加载时的图片
    UIScrollView,UIPageControl
    UIPickerView基本用法
    最大公约数和最小公倍数
    快速幂、快速乘
    素数筛
    最小生成树
    BZOJ1070 [SCOI2007]修车
    BZOJ1109 [POI2007]堆积木Klo
  • 原文地址:https://www.cnblogs.com/aaxwhxwh/p/9259092.html
Copyright © 2020-2023  润新知