美文网首页python
pyhton实战之pymysql初识

pyhton实战之pymysql初识

作者: 谜00016 | 来源:发表于2018-05-06 21:39 被阅读190次

    关键字:入手pymysql,增删改查,日期格式化,基金数据入库

            通过前面几篇博客,我们已经能简单的得到基金网站的一些信息,那么我们接下来的工作就是将抓取到的数据存入数据库。因此我们在本篇博客中主要是穿插记录一下在python中的数据库操作。

            数据库是实际开发中必定会用到的模块,相比较oracle、sqlserver而言,mysql不仅免费而且方便易用,因此本系列选择mysql作为我们的数据库。在python3+版本之后,一般使用的是pymysql三方库。照旧奉上pymysql官方文档地址:Welcome to PyMySQL’s documentation! — PyMySQL 0.7.2 documentation

            使用pycharm编辑器(有智能编辑器生活更美好)在虚拟环境中安装好pymysql,如下图

    pymysql主要掌握两个对象,一个是connection对象,一个是Cursor对象。顾名思义,connection对象是连接对象,在官方介绍中他有很多参数,但是很明显我们没必要一下子上来就把所有的参数都看个明白,只需知道几个重要的参数就行,比如host,user,password,db,charset等,Cursor对象是游标。主要有四种,如下,先做个总结,后面会有具体实例来观察他们各自有什么不同。

                    Cursor                 默认,查询返回list或tuple

                    DictCursor          查询返回dict,包含字段名

                    SSCursor            效果同Cursor。 无缓存游标

                    SSDictCursor      效果通DictCursor 。无缓存游标

            简单了解一下理论知识之后,我们来具体操练一下。下面是本地数据test的products表中的数据

               我们先从最简单的开始,把上述表中数据打印到控制台。我们第一步必须先连接上数据库,看如下代码:

                    connection =pymysql.connect(**dbconfig)

        是的,只需要一行代码就可以连上mysql数据库了,我们来看看connect方法:

    点进去,Connect方法 点进Connection方法

    至此我们看到,原来我们最终调用的是初始化init方法,可传入可变长参数和关键字参数。我们调用pymysql.connect(**dbconfig)来获取数据库连接对象,只需要传入一个配置参数就可以了。

    让我们看看dbconfig在哪里定义了?

    获取了连接对象之后,下一步就是获取游标对象。上面提到了,一共有四种游标对象,我们来先获取一下默认的Cursor游标对象,然后进行查询数据:

    只需要导入pymysql.cursors中的Cursor对象,然后传入connection对象即可获取默认游标对象。请注意一下当前使用默认游标对象返回的查询结果,没错,他是元组中包含元组,且没有返回数据库字段的,仅仅是值。

    我们如果使用DictCursor,如下

    返回的结果是list,里面的元素是字典,不仅返回了值,也返回了字段。

    那么Cursor与SSCursor,DictCursor与SSDictCursor这两组游标对象有什么区别呢?

    其实在上面已经给出了答案:Cursor是缓存的,SSCursor是没有缓存过的,后面一组同理。用大白话就是如果表中有几千万条数据,你使用Cursor,fetchall方法会有爆内存的风险,因为查询的结果缓存在了内存中,但是SSCursor不一样,他又叫流式游标,实际上没有缓存下来任何数据,它不会读取所有所有到内存中,它的做法是从储存块中读取记录,并且一条一条返回给你。

    具体使用如下:

    关于sql中的参数问题:

    如果此时我们要查询出p_id为2的数据,此时除了使用拼接sql的方式(有sql注入的风险),官方文档还告诉我们又别的方式来实现,我们查看一下官方文档,

    第一个参数是sql语句,第二个参数可以是元组,list或者字典。我们分别使用两个例子来操练一下:

    使用元组:cursor.execute("select * from products where p_id=%s",(2,))

    使用list:cursor.execute("select * from products where p_id=%s",[2])

    使用字典:cursor.execute("select * from products where p_id=%(p_id)s",{"p_id":2})

    是不是很类似java中预编译?以上三种都可以返回正确的结果。

    查询基本了解之后我们看下如果新增记录?

    插入单条记录很简单,参照上面关于参数的知识,我们很容易就可以写出如下sql:

    cursor.execute("insert into products (p_name) VALUES (%s)",["测试1"])

    如果我们要插入多条记录呢?同理,根据官方文档,我们可以调用executemany方法:

    cursor.executemany("insert into products (p_name) VALUES (%s)",(("测试1",),("测试2",),("测试3",)))

    cursor.executemany("insert into products (p_name) VALUES (%(p_name)s)",[{"p_name":"测试1"},{"p_name":"测试2"},{"p_name":"测试3"}])

    是不是炒鸡简单,哈哈!

    相关文章

      网友评论

        本文标题:pyhton实战之pymysql初识

        本文链接:https://www.haomeiwen.com/subject/ctgurftx.html