pandas中read_sql使用参数进行数据查询的实现

目录
  • 一、之前的处理方法
  • 二、使用 read_sql 中的 params 传入参数
    • 1.文档说明
    • 2.具体的使用
  • 三、总结对比
  • 四、字符串的格式化

pandas.read_sql 可以在数据库中执行指定的SQL语句查询或对指定的整张表进行查询,以DataFrame 的类型返回查询结果,这是在跟数据库进行交互操作时很重要的一步——既读取数据,还返回DataFrame方便处理。

要解决的问题: 编写过的SQL语句需要重复使用,这就涉及到参数,使用参数来替换条件,然后根据需要替换参数。

一、之前的处理方法

在没有使用参数之前,我一直使用的是正则法,也就是利用 re.sub 这个方法将需要的SQL内容替换掉,这样的好处就是可以替换任意内容,缺点就是必须每次使用的时候 import re.sub。

    from re import sub
    import sqlalchemy
    import pandas as pd
    # 创建数据库连接,这里使用的是pymysql
    engine = sqlalchemy.create_engine("mysql+pymysql://username:password@ip:port/store_name")
    sql = "select * from test where id = 'pid'"
    # 使用 sub 进行数据替换
    data = pd.read_sql(sub("pid", '1', sql), engine)

在这里使用的时候 pid 是为了统一处理才用的标识名,这样在以后不管什么时候都只需要对 pid 进行替换即可。

有一点需要注意的是 sub 替换后的传入是字符串,但是传入到 替换到SQL中是不会变的。比如

sql = "select * from test where id = pid" data =
pd.read_sql(sub("pid", '1', sql), engine)

进行 sub("pid", '1',> sql) 操作后 SQL 变成了

sql select * from test where id = 1

如果 id 字段是 int 类型那就没问题,但是如果 id 字段是 char 或 varchar 等其他类型就会出现字段类型是字符串但给的是数字(mysql 很宽容,不一定会报错,但是从数据类型上来说肯定是错了)

二、使用 read_sql 中的 params 传入参数

1.文档说明

 pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)[source]

read_sql 方法中已经有了 params 这个参数,这个就是可以进行参数的传递,具体的描述如下

params : list, tuple or dict, optional, default: None
List of parameters to pass to execute method. The syntax used to pass parameters is database driver dependent. Check your database driver documentation for which of the five syntax styles, described in PEP 249’s paramstyle, is supported. Eg. for psycopg2, uses %(name)s so use params={‘name’ : ‘value’}

意思就是可以使用功能 list, tuple or dict 传递参数,但是如何怎么设置参数和传递参数需要依据使用的数据库引擎。PEP 249’s paramstyle 如下表

paramstyle Meaning
qmark Question mark style, e.g. …WHERE name=?
numeric Numeric, positional style, e.g. …WHERE name=:1
named Named style, e.g. …WHERE name=:name
format ANSI C printf format codes, e.g. …WHERE name=%s
pyformat Python extended format codes, e.g. …WHERE name=%(name)s

总结下就是在SQL语句中使用?, :1, :name, %s, %设置参数,然后在params 使用 list, tuple or dict 进行参数的传递

2.具体的使用

    from re import sub
    import sqlalchemy
    import pandas as pd
    # 创建数据库连接
    engine = sqlalchemy.create_engine("mysql+pymysql://username:password@ip:port/store_name")
    sql = "select * from test where id = %(pid)s"
    # 使用 params 进行参数传递
    data = pd.read_sql(sql, engine, params={'pid': '1'})

具体的参数就如上面代码所示,使用了 %(pid)s 设置参数,再用params={‘pid’: ‘1’}传递参数,在Stack Overflow上有个提问也是关于这个的,里面还有关于psycopg2 和SQLite 的参数传递。

三、总结对比

之前没有想过使用参数,是因为在SQL中我不仅要替换固定条件,而且有时候需要替换大段的SQL,所以使用 sub 会更灵活也更模糊(传入的是字符串,到了SQL里面数字还是字符串得再处理一遍),但是使用方法自带的参数传递可以很明确的传递正确的数据和数据类型,而且不觉得使用方法自带的参数传递很优雅?

四、字符串的格式化

对于参数的传递还有另外一种就是python中的字符串格式化,format函数可以实现不带参数、带索引参数、带关键字参数,python的字符串格式化可以参考python格式化输出
下面是format的使用示例

in : print("{one} are {two} {three}".format(one='you', two=1, three='pig'))
out: you are 1 pig

这里的1应该为a,但是为了演示传递整数参数

到此这篇关于pandas中read_sql使用参数进行数据查询的实现的文章就介绍到这了,更多相关pandas read_sql查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python Pandas pandas.read_sql函数实例用法

    Pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具.Pandas提供了大量能使我们快速便捷地处理数据的函数和方法.你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一.本文主要介绍一下Pandas中read_sql方法的使用. pandas.read_sql(sql,con,index_col = None,coerce_float = True,params

  • Python Pandas pandas.read_sql_query函数实例用法分析

    Pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具.Pandas提供了大量能使我们快速便捷地处理数据的函数和方法.你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一.本文主要介绍一下Pandas中read_sql_query方法的使用. pandas.read_sql_query(sql,con,index_col = None,coerce_float =

  • pandas中read_sql使用参数进行数据查询的实现

    目录 一.之前的处理方法 二.使用 read_sql 中的 params 传入参数 1.文档说明 2.具体的使用 三.总结对比 四.字符串的格式化 pandas.read_sql 可以在数据库中执行指定的SQL语句查询或对指定的整张表进行查询,以DataFrame 的类型返回查询结果,这是在跟数据库进行交互操作时很重要的一步——既读取数据,还返回DataFrame方便处理. 要解决的问题: 编写过的SQL语句需要重复使用,这就涉及到参数,使用参数来替换条件,然后根据需要替换参数. 一.之前的处理

  • Pandas中Series的创建及数据类型转换

    目录 一.实战场景 二.主要知识点 三.菜鸟实战 1.创建 python 文件,用Numpy创建Series 2.转换Series的数据类型 四.补充 1.创建 python 文件,数据list,变成Pandas的Series对象 2.数据dict变成Pandas的Series对象 3.把Pandas的Series对象变成数据list 一.实战场景 实战场景:Pandas中Series的创建和数据类型转换,Series的创建和数据类型转换,Series 类似于一维数组与字典(map)数据结构的结

  • pandas中对文本类型数据的处理小结

    目录 1.英文字母大小写转换及填充 2.字符串合并与拆分 2.1 多列字符串合并 2.2 一列 列表形式的文本合并为一列 2.3 一列字符串与自身合并成为一列 2.4 一列字符串拆分为多列 2.4.1 partition函数 2.4.2 split函数 2.4.3 rsplit函数 3.字符串统计 3.1 统计某列字符串中包含某个字符串的个数 3.2 统计字符串长度 4.字符串内容查找(包含正则) 4.1 extract 4.2 extractall 4.3 find 4.4 rfind 4.5

  • 浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)

    pandas为我们提供了多种切片方法,而要是不太了解这些方法,就会经常容易混淆.下面举例对这些切片方法进行说明. 数据介绍 先随机生成一组数据: In [5]: rnd_1 = [random.randrange(1,20) for x in xrange(1000)] ...: rnd_2 = [random.randrange(1,20) for x in xrange(1000)] ...: rnd_3 = [random.randrange(1,20) for x in xrange(1

  • 在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例

    最近在工作中,遇到了数据合并.连接的问题,故整理如下,供需要者参考~ 一.concat:沿着一条轴,将多个对象堆叠到一起 concat方法相当于数据库中的全连接(union all),它不仅可以指定连接的方式(outer join或inner join)还可以指定按照某个轴进行连接.与数据库不同的是,它不会去重,但是可以使用drop_duplicates方法达到去重的效果. concat(objs, axis=0, join='outer', join_axes=None, ignore_ind

  • pandas中的数据去重处理的实现方法

    数据去重可以使用duplicated()和drop_duplicates()两个方法. DataFrame.duplicated(subset = None,keep ='first' )返回boolean Series表示重复行 参数:  subset:列标签或标签序列,可选 仅考虑用于标识重复项的某些列,默认情况下使用所有列 keep:{'first','last',False},默认'first' first:标记重复,True除了第一次出现. last:标记重复,True除了最后一次出现

  • 对python pandas中 inplace 参数的理解

    pandas 中 inplace 参数在很多函数中都会有,它的作用是:是否在原对象基础上进行修改 inplace = True:不创建新的对象,直接对原始对象进行修改: ​inplace = False:对数据进行修改,创建并返回新的对象承载其修改结果. 默认是False,即创建新的对象进行修改,原对象不变,和深复制和浅复制有些类似. 例: inplace=True情况: import pandas as pd import numpy as np df=pd.DataFrame(np.rand

  • 详解Django中views数据查询使用locals()函数进行优化

    优化场景 利用视图函数(views)查询数据之后可以通过上下文context.字典.列表等方式将数据传递给HTML模板,由template引擎接收数据并完成解析.但是通过context传递数据可能就存在在不同的视图函数中使用重复的查询语句,所以可以通过将重复查询语句设置全局变量,配合locals()函数进行数据查询与传递. 优化前 def index(request): threatname = '威胁情报展示' url = 'www.testtip.com' allthreat = Threa

  • 详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据

    pandas的DataFrame对象,本质上是二维矩阵,跟常规二维矩阵的差别在于前者额外指定了每一行和每一列的名称.这样内部数据抽取既可以用"行列名称(对应.loc[]方法)",也可以用"矩阵下标(对应.iloc[]方法)"两种方式进行. 下面具体说明: (以下程序均在Jupyter notebook中进行,部分语句的print()函数省略) 首先生成一个DataFrame对象: import pandas as pd score = [[34,67,87],[68

  • pandas中DataFrame数据合并连接(merge、join、concat)

    pandas作者Wes McKinney 在[PYTHON FOR DATA ANALYSIS]中对pandas的方方面面都有了一个权威简明的入门级的介绍,但在实际使用过程中,我发现书中的内容还只是冰山一角.谈到pandas数据的行更新.表合并等操作,一般用到的方法有concat.join.merge.但这三种方法对于很多新手来说,都不太好分清使用的场合与用途.今天就pandas官网中关于数据合并和重述的章节做个使用方法的总结. 文中代码块主要有pandas官网教程提供. 1 concat co

随机推荐