pymysql以表名作為變數傳遞進查詢語句中

2022-04-30 18:36:11 字數 1260 閱讀 8658

在使用cursor.execute(sql, param)時,pymysql庫會自動轉義含有%s的字串,所以不要畫蛇添足在sql語句中給%s加引號了,會報1064的錯誤滴!

另外也有許多人使用有sql注入隱患的cursor.execute(sql % param)這種用法,這樣是可以給%s加引號的。

在我們學習使用pymysql的時候有時需要把表名當做變數傳遞到sql語句中去執行,

然而我們的固定思維模式有時卻限制了我們:

如:我們知道傳遞變數可以用佔位符%s,後面加上變數就行,

在pymysql中也有同樣的問題,我們在執行sql語句的時候可以把變數傳遞進去

類似:

sql = 'insert into tabname + ' value (%s %s)'

cursor.execute(sql, [name,age])

如果我們的tabname也是變數的話我們就會習慣性的這樣加

sql = 'insert into %s + ' value (%s %s)'

cursor.execute(sql, [tabname,name,age])

然後這樣報錯了我們才知道這樣不行,然後再去查原因,發現我們被自己的固定思維給限制住了(反正我是這樣的)

我也是在網上找了半天再找到了解決辦法,只要跳出這樣的思維就行了

錯誤:

sql = 'insert into %s + ' value (%s %s)'

cursor.execute(sql, [tabname,name,age])

改為:sql = 'insert into %s(name,age)' %tabname + ' value (%s)'

cursor.execute(sql, [name])

這樣就沒問題了,有時候我們是能解決這類似的問題的,但是我們卻是往往被自己的固定思維給坑了!

sql 操作用字串拼接不是乙個好的習慣(這樣會有sql注入的風險), 試試用引數化查詢:

find_binary=pymysql.binary(img_data)            #使用binary()函式來指定儲存的是二進位制

add_row = """insert into imgs(id,img,編號,dataimg) values($s, %s, %s, %s)"""

cursor.execute(add_row, (7, 'k1', 'no.', find_binary))

表名作為變數的應用

需求 一組表 假如有20個 中,每個表都有goodsno欄位,如果這20個表的goodsno都不含值b,那麼就將這20個表的goodsno值為a的記錄的goodsno值修改為b 第一步 begin if object id tempdb.tablenames is not null drop tab...

Sql Server中用變數名作為表名的解決方案

最近寫 procedure 遇到一些問題。其中我覺得關於 用變數名作為表名 的問題較有價值,寫出和大家一起分享。請各位若有好的解決方案一定要不吝賜教。情景 如果你在寫 procedure 時要根據特定變數的值動態建立 table 表名是全部或部分特定變數的值 例如 declare tablename...

儲存過程 動態sql 將動態列名作為變數傳值

背景 這兩天有個需求,每天並且每10分鐘從es取一次資料 每次大概五萬多條車輛資料 每台車有veh,vom兩欄位,vom為車輛狀態資訊 會改變 每十分鐘都要記錄一次車輛狀態,將此資訊存在資料庫的veh state表裡面。再將這些資料用echarts表現出來 後話 所以,資料庫表的列名定為 veh,d...