2014-04-22 70 views
0

我有一個arduino uno和temp36。我使用Python從arduino串行監視器讀取傳感器值。有用!!不能在MySQL中使用Python插入或創建表格

但我不能在使用Python創建的MySQL表中插入,我不知道爲什麼。我沒有錯誤或警告。

import serial 
import time 
import MySQLdb 

dbhost = 'localhost' 
dbname = 'test' 
dbuser = 'X' 
dbpass = 'Y' 
ser = serial.Serial('COM7',9600,timeout=1) # On Ubuntu systems, /dev/ttyACM0 is the default path to the serial device on Arduinos, yours is likely different. 
while 1: 
time.sleep(1) 
the_goods = ser.readline() 
str_parts = the_goods.split(' ') 
conn = MySQLdb.connect (host = dbhost, 
       user = dbuser, 
       passwd = dbpass, 
       db = dbname) 
cursor = conn.cursor() 
sql = "INSERT INTO arduino_temp (temperature) VALUES ('%s');" % (str_parts[0]) 
print "Number of rows inserted: %d" % cursor.rowcount 
try: 
    cursor.execute(sql) 
except: 
    pass 
cursor.close() 
conn.autocommit=True 
conn.close() 
print the_goods 

我做錯了什麼?

在SQL表這些價值需要在PHP中的情節(實時ploting)

硬件:Windows 7中的Python 2.7,Python編輯:Pyscripter,Arduino的烏諾,MySQL工作臺

+0

您需要從除去'try' /'except'一攬子異常處理開始。你的'autocommit'變化來得太遲而不適用於insert語句。 –

+0

您不應該使用字符串格式化sql-command,而是使用佔位符:'cursor.execute('INSERT INTO arduino_temp(temperature)VALUES(%s)',str_parts [0])' – Daniel

+0

非常感謝您的迴應。我得到一個錯誤:programmingerror:「表test.arduino_temp不存在。」該錯誤的含義是什麼? – user3559628

回答

1

你必須在執行sql語句後執行:

cursor.execute(sql) 
cursor.commit() 

或在連接建立後設置爲autocommit=True

+1

OP確實嘗試設置'autocommit = True',但是這太遲了。 –

1

如果您打開數據庫連接,它最初的模式是autocommit=False,所以執行SQL語句後您必須使用commit()它。異常時也不要pass。這樣你就不會看到問題。您可以將異常記錄到文件中。在執行INSERT語句之前,還使用cursor.rowcount。在它之後使用它。

從您的意見看來,你沒有定義arduino_temp數據庫。我沒有MySQL數據庫,但我已經使用PostgreSQL和ODBC驅動程序測試了這些代碼。你可以用它來測試你的數據庫和驅動程序:

import MySQLdb 
import traceback 


def ensure_table(conn): 
    cursor = conn.cursor() 
    try: 
     cursor.execute('SELECT COUNT(*) FROM arduino_temp') 
     for txt in cursor.fetchall(): 
      print('Number of already inserted temepratures: %s' % (txt[0])) 
    except: 
     s = traceback.format_exc() 
     print('Problem while counting records:\n%s\n' % (s)) 
     print('Creating arduino_temp table ...') 
     # table arduino_temp does not exist 
     # you have to define table there 
     # you will probably have to add some columns as: 
     # test_id SERIAL primary key, 
     # test_date timestamp default CURRENT_TIMESTAMP, 
     # and add index on test_date 
     cursor.execute('CREATE TABLE arduino_temp (temperature integer)') 
     print('table created') 
    cursor.close() 


def insert_temperature(conn, temperature): 
    cursor = conn.cursor() 
    #cursor.execute("INSERT INTO arduino_temp (temperature) VALUES (?)", (temperature,)) 
    #cursor.execute("INSERT INTO arduino_temp (temperature) VALUES (%s)", (temperature,)) 
    cursor.execute("INSERT INTO arduino_temp (temperature) VALUES (%d)" % (int(temperature))) 
    print("Number of rows inserted: %d" % (cursor.rowcount)) 
    conn.commit() 
    cursor.close() 


def main(): 
    # ... 
    conn = MySQLdb.connect (host = dbhost, user = dbuser, passwd = dbpass, db = dbname) 
    #conn = pyodbc.connect('DSN=isof_test;uid=dbuser;pwd=dbpass') 
    ensure_table(conn) 
    insert_temperature(conn, 10) 


main() 

如果你有一個數據庫的問題創建測試代碼,並使用小功能。您的代碼從串行接口讀取溫度並將其插入數據庫。爲每個操作分別設置功能。

+0

非常感謝您的回覆。我得到一個錯誤:programmingerror:「表test.arduino_temp不存在。」該錯誤的含義是什麼? – user3559628

+0

這意味着在'test'數據庫中不存在'arduino_temp'表。您連接到錯誤的數據庫或拼寫錯誤的表名,或者您必須創建'arduino_temp'表。 –

+0

非常感謝您的回答。但它不起作用。 – user3559628