在Python中编写动态SQL语句
个人经验总结,有问题请指出
目录
- 0x00 前期准备
- 0x01 占位符方式(推荐)
- 0x02 字符串格式化
0x00 前期准备
import pymysql
import datetime
conn = pymysql.connect('localhost', 'root', '****', 'sakila')
cur = conn.cursor()# 这里准备编写sql语句cur.close()
conn.close()
0x01 占位符方式(推荐)
aid = 1
dt = datetime.datetime(2014, 9, 25, 22, 30, 27)
sql = """SELECT * FROM address WHERE address_id = %s AND last_update = %s"""cur.execute(sql, (aid, dt)) # 多个占位符的话用tuple或list
print(cur.fetchall())
param = {'dt': datetime.datetime(2014, 9, 25, 22, 30, 27)}
sql = """SELECT * FROM address WHERE address_id = 1 AND last_update = %s"""cur.execute(sql, parma.get('dt')) # 一个占位符,只传相应的值或变量即可
print(cur.fetchall())
表名不可使用占位符,如需动态表名,请先使用format格式化sql语句。以下是分析,可以跳过。
# 错误示范
tb = 'address'
aid = 1
dt = datetime.datetime(2014, 9, 25, 22, 30, 27)
sql = """SELECT * FROM %s WHERE address_id = %s AND last_update = %s""" # 表名占位符
cur.execute(sql, (tb, aid, dt)) # 此处会报错pymysql.err.ProgrammingError,提示sql语句有问题
print(cur.fetchall())
我们打断点在cur.execute(sql, (tb, aid, dt))
,DEBUG进入execute
方法,F8逐行执行,会有如下图
由图可见,它在表名上加了引号,故sql语法错误。
如需动态表名,请先使用format格式化sql语句。
# 正确示范
tb = 'address'
aid = 1
dt = datetime.datetime(2014, 9, 25, 22, 30, 27)
# 因为%s已经用作占位符,我们不能再用%s来格式化表名,只能用format
sql = """SELECT * FROM {} WHERE address_id = %s AND last_update = %s""".format(tb)
cur.execute(sql, (aid, dt))
print(cur.fetchall())
0x02 字符串格式化
- %
tb = 'address'
aid = 1
dt = datetime.datetime(2014, 9, 25, 22, 30, 27)
# 注意last_update列加了引号
sql = """SELECT * FROM %s WHERE address_id = %d AND last_update = '%s' """ % (tb, aid, dt)
cur.execute(sql)
print(cur.fetchall())
param = {'tb': 'address','aid': 1,'dt': datetime.datetime(2014, 9, 25, 22, 30, 27),
}
# 注意last_update列加了引号
sql = """SELECT * FROM %(tb)s WHERE address_id = %(aid)d AND last_update = '%(dt)s' """ % param
cur.execute(sql)
print(cur.fetchall())
- format()
tb = 'address'
aid = 1
dt = datetime.datetime(2014, 9, 25, 22, 30, 27)
# 注意last_update列加了引号
sql = """SELECT * FROM {} WHERE address_id = {} AND last_update = '{}'""".format(tb, aid, dt)# 参数已经是一个tuple或者list时,且位置一一对应
# param = (tb, aid, dt)
# sql = """SELECT * FROM {} WHERE address_id = {} AND last_update = '{}'""".format(*param)# 参数已经是一个tuple或者list时,但位置不对或只需其中某些参数
# sql = """SELECT * FROM {1[0]} WHERE address_id = {0[0]} AND last_update = '{0[1]}'""".format((aid, dt)(tb,))
cur.execute(sql)
print(cur.fetchall())
param = {'tb': 'address','aid': 1,'dt': datetime.datetime(2014, 9, 25, 22, 30, 27),
}
# 注意last_update列加了引号
sql = """SELECT * FROM {0[tb]} WHERE address_id = {0[aid]} AND last_update = '{0[dt]}' """.format(param)
cur.execute(sql)
print(cur.fetchall())
- +(勿用)
tb = 'address'
aid = 1
dt = datetime.datetime(2014, 9, 25, 22, 30, 27)
sql = """SELECT * FROM """+tb+""" WHERE address_id = """+str(aid)+""" AND last_update = '"""+dt.strftime('%Y-%m-%d %H:%M:%S')+"'"
cur.execute(sql)
print(cur.fetchall())
在Python中编写动态SQL语句相关推荐
- oracle中执行动态sql语句吗,oracle中有没有可动态执行sql语句的函数
oracle中有没有可动态执行sql语句的函数 关注:233 答案:2 手机版 解决时间 2021-03-05 15:53 提问者祗剩寂寞 2021-03-04 22:38 oracle中有没有可 ...
- mybatis中mapper文件中的动态sql语句
有时候在检索时,用户提供的数据不一样多,我们很难使用静态的sql语句进行判别,所以这个时候需要使用动态的sql语句 这里主要针对Mapper.xml文件中的sql语句,笔者在下面所有的例子中只提供了M ...
- 存储过程中执行动态Sql语句
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...
- PB中执行动态SQL语句(温故知新)
转自:http://blog.sina.com.cn/s/blog_538f907c0100fak4.html PowerBuilder的嵌入式SQL语句只能支持一些固定的标准的SQL语句,即在进行程 ...
- Mybatis 中update动态SQL语句
Mybatis中的CRUD操作(增删改查)中,简单的SQL操作比较直观,如查找操作: <select id="findBySrcId" resultMap="ent ...
- python定义字符串数组_从字符串数组(或元组)在Python中创建动态sql“ in list”子句的“最佳”方法是什么?...
我正在从Python(使用MySQLDb)运行一个动态MySQL查询,该查询包括一个包含字符串值的" in list"子句.执行此功能的函数将获取一个值数组.如果有帮助,我可以将该 ...
- oracle 动态执行ddl语句,Oracle过程中执行动态SQL或DDL语句
如果你用的是 Oracle 8i 及以上的版本,那简单,在过程中用 execute immediate sql_str 就行, sql_str 是一个拼凑的 SQL 语句, 如果你用的是 Oracle ...
- Mybatis第三天动态Sql语句、XML中一对多、多对一、多对多该怎么写
Mybatis第三天 Mybatis中使用unpooled配置连接池原理分析 Mybatis中使用pooled配置连接的原理分析 Mybatis中的事务原理和自动提交设置 Mybatis中的动态sql ...
- oracle表名使用变量名,oracle 中动态sql语句,表名为变量,怎么解?
如果你用的是 Oracle 8i 及以上的版本,那简单,在过程中用 execute immediate sql_str 就行, sql_str 是一个拼凑的 SQL 语句,但这个动态语句中带参数,或 ...
最新文章
- 到底是先更新数据库还是先更新缓存?
- 键盘历史记录实用程序已停止工作 解决办法
- 上传Android或Java库到Maven central repository(转载)
- [置顶] Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite...
- Android studio如何连接三星手机
- java中四种默认的权限修饰符,Java中四种访问权限资料整理
- LQ训练营(C++)学习笔记_枚举算法
- Redis(1) 简介以及linux环境下的安装
- MySQL 索引失效的 15 种场景!
- Spring @PropertySource
- ubuntu 20.04 源码编译 cmake
- 开源阅读书源_安卓神器 | 开源小说软件阅读3.0,附赠大量书源
- 理解一下策略模式,工厂模式
- 传统语音识别(GMM+HMM)
- 剑指offer32-III.从上到下打印二叉树(蛇形打印)
- 高德路径规划预估打车价格
- IBM WebSphere 9.0.5 笔记大全
- c++倒序输出一个四位整数
- Java、解一元二次方程
- 什么是数据产品,怎么设计一个好用的数据产品