2017-08-14 95 views
0

下面是不工作Python和MySQL查詢插入 - 單參數

#!/usr/bin/python 

import urllib 
import datetime 
import mysql.connector 

data['price'] = 100 

# Write to database 
cnx = mysql.connector.connect(user='user', password='pw', database='db') 
cursor = cnx.cursor() 

query = ("INSERT INTO records(price) VALUES(%s) ") 
cursor.execute(query, (data['price'])) 

cnx.commit() 

cursor.close() 
cnx.close() 

MySQL有相應的表和列的代碼。

  • ID(PRIMARY INT AUTO_INCREMENT)
  • 價格(FLOAT)

沒有連接問題。

它給出了以下錯誤。任何想法?

Traceback (most recent call last): File "./sys-fetchdata.py", line 22, in cursor.execute(query, (data['price'])) File "/usr/lib/python2.7/dist-packages/mysql/connector/cursor.py", line 507, in execute self._handle_result(self._connection.cmd_query(stmt)) File "/usr/lib/python2.7/dist-packages/mysql/connector/connection.py", line 722, in cmd_query result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query)) File "/usr/lib/python2.7/dist-packages/mysql/connector/connection.py", line 640, in _handle_result raise errors.get_exception(packet) mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%s)' at line 1

+0

@hiro_protagonist謝謝。你應該回答這個問題。這是問題的根源。 –

回答

2

MySQLCursor.execute() method需要tuple(或dict)作爲第二(params)參數。

你的情況:它應該是(data['price'],)(注意額外的逗號;沒有它,括號沒有作用)而不是(data['price'])

+0

謝謝,這是一些奇怪的錯誤。在發佈這個問題之前需要幾個小時。 –

+0

我同意:錯誤信息應該比信息更豐富... –

1

讓我們試着找到一個解決方案:

  1. 不要執行查詢,而不是mogrify並打印。例如:

    query = ("INSERT INTO records(price) VALUES(%s) ") 
    query_to_be_executed = cursor.mogrify(query, (data['price'])) 
    print(query_to_be_executed) 
    
  2. 下一頁嘗試在bash或phpMyAdmin的手動執行打印的查詢,並修復它。

  3. 最後在你的python代碼中使用固定查詢。
+0

謝謝你的回答。這應該有助於調試過程,但hiro指出了問題的確切根源。 –

+0

[mogrify](http://initd.org/psycopg/docs/cursor.html#cursor.mogrify)特定於PostgreSQL數據庫適配器'psycopg'。 [MySQL連接器/ Python](https://dev.mysql.com/doc/connector-python/en/)沒有'mogrify',所以它不能用於這個問題的上下文。 – Odysseas

+0

奧德賽,我不知道。我知道這是一種方法,但也許作者可以使用PostgreSQL數據庫? – tpszer