数据库原理与应用 第 17 章 · 上机四
课程第 17 章上机四 起手式课件的拼法交给它去拼少写一个逗号一个引号一次插好几条连续练习 版式
第 17 章 使用 Python 连接 MySQL 数据库 · 上机四

参数化:别自己拼 SQL

课件全程都在用 % 拼串,这一份补上它没讲的那一种写法和它挡住的那种事故。
已完成 0 / 6
本 次 上 机 题 目
  1. 01装驱动、进解释器、连上库
  2. 02sql = “... AGE >=%s” % 20
  3. 03cursor.execute(sql, (20,))
  4. 04(20) 不是元组,(20,) 才是
  5. 05拼串当场断句,参数化没事
  6. 06executemany 把列表灌进去
  7. 自己写一个:按专业查,用参数化
01
第 17 章 · 上机四

装驱动、进解释器、连上库

这一页讲 SQL 里的值该怎么传进去。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

这一页只查不改,一句 commit 都用不着。

知道更多

参数化是课件没讲的一种写法,也是真正该用的那一种。

02
第 17 章 · 上机四

sql = “... AGE >=%s” % 20

% 是 Python 在拼字符串,跟数据库没有关系。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

拼完的 sql 是一句完整的字符串,服务器收到的就是它。

知道更多

AGE 大写也认,SQL 的关键字与列名不区分大小写。

想一想

把 20 换成一个用户输入的值,这句还安全吗?

03
第 17 章 · 上机四

cursor.execute(sql, (20,))

%s 留在原地,值单独放在后面那个元组里。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

参数化的 %s 不加引号,是字符串还是数字由驱动去判断。

分清楚两种写法

写法值在哪儿
% 拼串拼进 SQL
execute 两参单独送

知道更多

有几个 %s 就要给几个值,多一个少一个都会报错。

04
第 17 章 · 上机四

(20) 不是元组,(20,) 才是

Python 里一个元素的元组,逗号不能省。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

(20) 就是数字 20,加个逗号才变成只有一个元素的元组。

知道更多

报错那句话说得很直白:it must be of type list, tuple or dict。

想一想

换成 [20] 行不行?

05
第 17 章 · 上机四

拼串当场断句,参数化没事

O'Brien 这种名字,是拼串写法最经典的翻车点。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

拼串把用户输入直接当成了 SQL 的一部分,引号一多就变了意思。

知道更多

这就是 SQL 注入的原理,参数化能挡住它,是这一章最该带走的一条。

想一想

如果名字是 ' OR '1'='1 会查出几行?

06
第 17 章 · 上机四

executemany 把列表灌进去

SQL 只写一遍,值放在一个列表里。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

executemany 一次发一批,rowcount 给的是这一批的总行数。

知道更多

这里故意 rollback,所以最后查出来是空列表,这一题能反复跑。

想一想

把 rollback 换成 commit,再跑一遍会报什么?

第 17 章 · 上机四

自己写一个:按专业查,用参数化

把专业名存进一个变量,再传进去。

Microsoft Windows [版本 10.0.18363.1256]
(c) 2019 Microsoft Corporation。保留所有权利。
终端停在 Windows 的命令提示符上。敲 python 进 >>>,敲 exit() 退回来,敲 mysql -u root -p123456 teaching 还能用 SQL 验一遍程序刚才干了什么。
mysql>

重 点

同一句 SQL 换个值再跑一遍,这就是参数化最实用的地方。

知道更多

这一题只查不改,跑几遍都一样。

想一想

把 maj 换成一个学生自己输入的字符串,还要注意什么?

保山学院·人工智能教研室·曹鼎鼎