iT邦幫忙

0

pymysql 錯誤訊息:TypeError: not all arguments converted during string formatting

小弟使用 pymysql 更新 MySQL 內的資料
出現錯誤訊息:TypeError: not all arguments converted during string formatting
在此尋求各位大德的協助。
相關資料如下
Table 描述
mysql> desc Ledger;
+-------------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+---------------------+------+-----+---------+-------+
| ldgr_AgentID | varchar(12) | NO | PRI | | |
| ldgr_CompanyID | varchar(15) | NO | PRI | | |
| ldgr_CompanyDupl | tinyint(3) unsigned | NO | PRI | NULL | |
| ldgr_A_Currency | enum('NTD','USD') | YES | | NULL | |
| ldgr_A_ChargeQty | varchar(255) | YES | | NULL | |
| ldgr_A_FreeQty | varchar(255) | YES | | NULL | |
| ldgr_A_ManualQty | varchar(255) | YES | | NULL | |
| ldgr_A_AJE_Qty | varchar(255) | YES | | NULL | |
| ldgr_A0_Rab_PAmt | varchar(255) | YES | | NULL | |
| ldgr_A0_Rab | varchar(255) | YES | | NULL | |
| ldgr_A0_Red | varchar(255) | YES | | NULL | |
| ldgr_A0_Red_PAmt | varchar(255) | YES | | NULL | |
| ldgr_A1_Rab_PAmt | varchar(255) | YES | | NULL | |
| ldgr_A1_Rab | varchar(255) | YES | | NULL | |
| ldgr_A1_Red | varchar(255) | YES | | NULL | |
| ldgr_A1_Red_PAmt | varchar(255) | YES | | NULL | |
| ldgr_A2_Rab_PAmt | varchar(255) | YES | | NULL | |
| ldgr_A2_Rab | varchar(255) | YES | | NULL | |
| ldgr_A2_Red | varchar(255) | YES | | NULL | |
| ldgr_A2_Red_PAmt | varchar(255) | YES | | NULL | |
| ldgr_B_ChargeQty | varchar(255) | YES | | NULL | |
| ldgr_B_FreeQty | varchar(255) | YES | | NULL | |
| ldgr_B_ManualQty | varchar(255) | YES | | NULL | |
| ldgr_B_AJE_Qty | varchar(255) | YES | | NULL | |
| ldgr_B0_Rab | varchar(255) | YES | | NULL | |
| ldgr_B0_Red | varchar(255) | YES | | NULL | |
| ldgr_B1_Rab | varchar(255) | YES | | NULL | |
| ldgr_B1_Red | varchar(255) | YES | | NULL | |
| ldgr_B2_Rab | varchar(255) | YES | | NULL | |
| ldgr_B2_Red | varchar(255) | YES | | NULL | |
| ldgr_C_ChargeQty | varchar(255) | YES | | NULL | |
| ldgr_C_FreeQty | varchar(255) | YES | | NULL | |
| ldgr_C_ManualQty | varchar(255) | YES | | NULL | |
| ldgr_C_AJE_Qty | varchar(255) | YES | | NULL | |
| ldgr_C0_Rab | varchar(255) | YES | | NULL | |
| ldgr_C0_Red | varchar(255) | YES | | NULL | |
| ldgr_C1_Rab | varchar(255) | YES | | NULL | |
| ldgr_C1_Red | varchar(255) | YES | | NULL | |
| ldgr_C2_Rab | varchar(255) | YES | | NULL | |
| ldgr_C2_Red | varchar(255) | YES | | NULL | |
| ldgr_LA_ChargeQty | varchar(255) | YES | | NULL | |
| ldgr_LA_FreeQty | varchar(255) | YES | | NULL | |
| ldgr_LA_Rab | varchar(255) | YES | | NULL | |
+-------------------+---------------------+------+-----+---------+-------+
43 rows in set (0.00 sec)

mysql>

pymysql 的 cursor 使用dict,操作記錄如下:

sql_r_ldgr = "SELECT * FROM Ledger WHERE ldgr_AgentID = %s AND ldgr_CompanyID = %s AND ldgr_CompanyDUpl = %s;"
sql_u_ldgr = "UPDATE Ledger SET ldgr_A_ChargeQty = %s, ldgr_A_FreeQty = %s, ldgr_A_ManualQty = %s, ldgr_A_AJE_Qty = %s, ldgr_A0_Rab_PAmt = %s, ldgr_A0_Rab = %s, ldgr_A0_Red = %s, ldgr_A0_Red_PAmt = %s, ldgr_A1_Rab_PAmt = %s, ldgr_A1_Rab = %s, ldgr_A1_Red = %s, ldgr_A1_Red_PAmt = %s, ldgr_A2_Rab_PAmt = %s, ldgr_A2_Rab = %s, ldgr_A2_Red = %s, ldgr_A2_Red_PAmt = %s, ldgr_B_ChargeQty = %s, ldgr_B_FreeQty = %s WHERE ldgr_AgentID = %s AND ldgr_CompanyID = %s AND ldgr_CompanyDupl = %s;"

tmp = {}
tmp['Agent'] = 'ABC'
tmp['Company'] = 'ABC'
tmp['CompDupl'] = 1

cursor.execute(sql_r_ldgr, (tmp['Agent'], tmp['Company'], tmp['CompDupl']))
1
ldg = cursor.fetchone()

ldg # 查看讀取的資料,除PRI KEY與 Currency外,皆為None
{'ldgr_AgentID': 'ABC', 'ldgr_CompanyID': 'ABC', 'ldgr_CompanyDupl': 1, 'ldgr_A_Currency': 'USD', 'ldgr_A_ChargeQty': None, 'ldgr_A_FreeQty': None, 'ldgr_A_ManualQty': None, 'ldgr_A_AJE_Qty': None, 'ldgr_A0_Rab_PAmt': None, 'ldgr_A0_Rab': None, 'ldgr_A0_Red': None, 'ldgr_A0_Red_PAmt': None, 'ldgr_A1_Rab_PAmt': None, 'ldgr_A1_Rab': None, 'ldgr_A1_Red': None, 'ldgr_A1_Red_PAmt': None, 'ldgr_A2_Rab_PAmt': None, 'ldgr_A2_Rab': None, 'ldgr_A2_Red': None, 'ldgr_A2_Red_PAmt': None, 'ldgr_B_ChargeQty': None, 'ldgr_B_FreeQty': None, 'ldgr_B_ManualQty': None, 'ldgr_B_AJE_Qty': None, 'ldgr_B0_Rab': None, 'ldgr_B0_Red': None, 'ldgr_B1_Rab': None, 'ldgr_B1_Red': None, 'ldgr_B2_Rab': None, 'ldgr_B2_Red': None, 'ldgr_C_ChargeQty': None, 'ldgr_C_FreeQty': None, 'ldgr_C_ManualQty': None, 'ldgr_C_AJE_Qty': None, 'ldgr_C0_Rab': None, 'ldgr_C0_Red': None, 'ldgr_C1_Rab': None, 'ldgr_C1_Red': None, 'ldgr_C2_Rab': None, 'ldgr_C2_Red': None, 'ldgr_LA_ChargeQty': None, 'ldgr_LA_FreeQty': None, 'ldgr_LA_Rab': None}

#變更四個欄位資料
ldg['ldgr_A0_Rab_PAmt'] = '0,0,0,0,0,0,0,0,0,0,25920,25920,25920'
ldg['ldgr_A0_Rab'] = '0,0,0,0,0,0,0,0,0,0,962.85,962.85,962.85'
ldg['ldgr_A0_Red'] = '0,0,0,0,0,0,0,0,0,0,962.85,962.85,962.85'
ldg['ldgr_A0_Red_PAmt'] = '0,0,0,0,0,0,0,0,0,0,25920,25920,25920'

#更新資料庫
db.begin()
cursor.execute(sql_u_ldgr, (ldg['ldgr_A_ChargeQty'], ldg['ldgr_A_FreeQty'], ldg['ldgr_A_ManualQty'], ldg['ldgr_A_AJE_Qty'], ldg['ldgr_A0_Rab_PAmt'], ldg['ldgr_A0_Rab'], ldg['ldgr_A0_Red'], ldg['ldgr_A0_Red_PAmt'], ldg['ldgr_A1_Rab_PAmt'], ldg['ldgr_A1_Rab'], ldg['ldgr_A1_Red'], ldg['ldgr_A1_Red_PAmt'], ldg['ldgr_A2_Rab_PAmt'], ldg['ldgr_A2_Rab'], ldg['ldgr_A2_Red'], ldg['ldgr_A2_Red_PAmt'], ldg['ldgr_B_ChargeQty'], ldg['ldgr_B_FreeQty'], ldg['ldgr_B_ManualQty'], ldg['ldgr_B_AJE_Qty'], ldg['ldgr_B0_Rab'], ldg['ldgr_B0_Red'], ldg['ldgr_B1_Rab'], ldg['ldgr_B1_Red'], ldg['ldgr_B2_Rab'], ldg['ldgr_B2_Red'], ldg['ldgr_C_ChargeQty'], ldg['ldgr_C_FreeQty'], ldg['ldgr_C_ManualQty'], ldg['ldgr_C_AJE_Qty'], ldg['ldgr_C0_Rab'], ldg['ldgr_C0_Red'], ldg['ldgr_C1_Rab'], ldg['ldgr_C1_Red'], ldg['ldgr_C2_Rab'], ldg['ldgr_C2_Red'], ldg['ldgr_LA_ChargeQty'], ldg['ldgr_LA_FreeQty'], ldg['ldgr_LA_Rab'], tmp['Agent'], tmp['Company'], tmp['CompDupl']))
Traceback (most recent call last):
File "", line 1, in
File "/usr/local/lib/python3.6/site-packages/pymysql/cursors.py", line 168, in execute
query = self.mogrify(query, args)
File "/usr/local/lib/python3.6/site-packages/pymysql/cursors.py", line 147, in mogrify
query = query % self._escape_args(args, conn)
TypeError: not all arguments converted during string formatting

1 個回答

1
froce
iT邦高手 1 級 ‧ 2018-11-10 23:51:43
最佳解答

你 sql_u_ldgr 裡 %s 的數量是21個,插入的變數是 42 個。
數量兜不起來吧?

小魚 iT邦高手 1 級 ‧ 2018-11-11 07:31:18 檢舉

你還真有耐心, 一個一個算...

kjfang iT邦新手 5 級 ‧ 2018-11-11 08:55:44 檢舉

froce大大,
實在太感謝您了
這程式從我接手以來,改了三次版,每回都照樣 copy再修改。
初看到您的回應,想說:都用這麼久了,怎麼可能會犯這種低級錯誤?
再仔細數一下變數,還真的是少了一半
修正後,一切恢復正常。
只是不懂,印象中,若變數數量不對時Python會回應其他的錯誤訊息。
這回被錯誤訊息開頭的『TypeError』給誤導了
拼命往想資料型態方向去查....

froce iT邦高手 1 級 ‧ 2018-11-11 19:18:08 檢舉

你還真有耐心, 一個一個算...
其實我才覺得原po有耐心,可以那麼多欄位都一個一個填入...

TypeError: not all arguments converted during string formatting
這個通常會發生在元組數量和字串變數不符的時候。

幾個建議:
1.變數取有意義的
2.去學ORM
3.像這種欄位較多的,或許弄個迴圈或是其他方法來處理。
把程式弄得好維護一點。

我要發表回答

立即登入回答