个人经验总结,有问题请指出

目录

  • 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语句相关推荐

  1. oracle中执行动态sql语句吗,oracle中有没有可动态执行sql语句的函数

    oracle中有没有可动态执行sql语句的函数 关注:233  答案:2  手机版 解决时间 2021-03-05 15:53 提问者祗剩寂寞 2021-03-04 22:38 oracle中有没有可 ...

  2. mybatis中mapper文件中的动态sql语句

    有时候在检索时,用户提供的数据不一样多,我们很难使用静态的sql语句进行判别,所以这个时候需要使用动态的sql语句 这里主要针对Mapper.xml文件中的sql语句,笔者在下面所有的例子中只提供了M ...

  3. 存储过程中执行动态Sql语句

    MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...

  4. PB中执行动态SQL语句(温故知新)

    转自:http://blog.sina.com.cn/s/blog_538f907c0100fak4.html PowerBuilder的嵌入式SQL语句只能支持一些固定的标准的SQL语句,即在进行程 ...

  5. Mybatis 中update动态SQL语句

    Mybatis中的CRUD操作(增删改查)中,简单的SQL操作比较直观,如查找操作: <select id="findBySrcId" resultMap="ent ...

  6. python定义字符串数组_从字符串数组(或元组)在Python中创建动态sql“ in list”子句的“最佳”方法是什么?...

    我正在从Python(使用MySQLDb)运行一个动态MySQL查询,该查询包括一个包含字符串值的" in list"子句.执行此功能的函数将获取一个值数组.如果有帮助,我可以将该 ...

  7. oracle 动态执行ddl语句,Oracle过程中执行动态SQL或DDL语句

    如果你用的是 Oracle 8i 及以上的版本,那简单,在过程中用 execute immediate sql_str 就行, sql_str 是一个拼凑的 SQL 语句, 如果你用的是 Oracle ...

  8. Mybatis第三天动态Sql语句、XML中一对多、多对一、多对多该怎么写

    Mybatis第三天 Mybatis中使用unpooled配置连接池原理分析 Mybatis中使用pooled配置连接的原理分析 Mybatis中的事务原理和自动提交设置 Mybatis中的动态sql ...

  9. oracle表名使用变量名,oracle 中动态sql语句,表名为变量,怎么解?

    如果你用的是 Oracle 8i 及以上的版本,那简单,在过程中用 execute immediate sql_str 就行, sql_str 是一个拼凑的 SQL 语句,但这个动态语句中带参数,或 ...

最新文章

  1. 到底是先更新数据库还是先更新缓存?
  2. 键盘历史记录实用程序已停止工作 解决办法
  3. 上传Android或Java库到Maven central repository(转载)
  4. [置顶] Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite...
  5. Android studio如何连接三星手机
  6. java中四种默认的权限修饰符,Java中四种访问权限资料整理
  7. LQ训练营(C++)学习笔记_枚举算法
  8. Redis(1) 简介以及linux环境下的安装
  9. MySQL 索引失效的 15 种场景!
  10. Spring @PropertySource
  11. ubuntu 20.04 源码编译 cmake
  12. 开源阅读书源_安卓神器 | 开源小说软件阅读3.0,附赠大量书源
  13. 理解一下策略模式,工厂模式
  14. 传统语音识别(GMM+HMM)
  15. 剑指offer32-III.从上到下打印二叉树(蛇形打印)
  16. 高德路径规划预估打车价格
  17. IBM WebSphere 9.0.5 笔记大全
  18. c++倒序输出一个四位整数
  19. Java、解一元二次方程
  20. 什么是数据产品,怎么设计一个好用的数据产品

热门文章

  1. Spring MVC 原理
  2. vue实现商品分类左右联动
  3. homepage编写
  4. 开车打电话用什么蓝牙耳机好用?适合开车时用的蓝牙耳机
  5. 基于触摸屏的 输入系统应用分析
  6. Matrix-Synapse安装使用与注意事项
  7. 微型计算机最新情况,「简讯」英特尔公布7nm酷睿最新进展;OPPO手环活力版官宣……...
  8. ALLEGRO17.4印制板挖空
  9. NFS服务器搭建与配置
  10. labelme的安装