小弟使用 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'] = 1cursor.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
你 sql_u_ldgr 裡 %s 的數量是21個,插入的變數是 42 個。
數量兜不起來吧?
你還真有耐心, 一個一個算...
froce大大,
實在太感謝您了
這程式從我接手以來,改了三次版,每回都照樣 copy再修改。
初看到您的回應,想說:都用這麼久了,怎麼可能會犯這種低級錯誤?
再仔細數一下變數,還真的是少了一半
修正後,一切恢復正常。
只是不懂,印象中,若變數數量不對時Python會回應其他的錯誤訊息。
這回被錯誤訊息開頭的『TypeError』給誤導了
拼命往想資料型態方向去查....
你還真有耐心, 一個一個算...
其實我才覺得原po有耐心,可以那麼多欄位都一個一個填入...
TypeError: not all arguments converted during string formatting
這個通常會發生在元組數量和字串變數不符的時候。
幾個建議:
1.變數取有意義的
2.去學ORM
3.像這種欄位較多的,或許弄個迴圈或是其他方法來處理。
把程式弄得好維護一點。