私はpythonスクリプトをsqlite3の代わりにmysqlを使用するように変換しています。私はこの点を本当に困惑させたmysql構文エラーに多くの問題があります。私はデータベースに関する多くの経験がありません。それは短い時間の後、彼らはエラーをスローするラインが動作するようです。Pythonでmysqlをsqlite3に変換する
これは私に最初のエラーを与える行です。私は文法の権利を得ると、他のものもすべて変更できると思います。
elif 'Sensors' in line:
Sensors,pH1,pH2,Temp,RH,TDS1,TDS2,CO2,Light,Water,MagX,MagY,MagZ,TankTotal,Tank1,Tank2,Tank3,Tank4,WaterTempP1,WaterTempP2,WaterTempP3,WaterTempP4=line.split(",")
Sensors = Sensors.replace("Read fail", "")
WaterTempP4 = WaterTempP4.rstrip()
elapsedTime = now-startTime
elapsedSeconds = (elapsedTime.microseconds+(elapsedTime.days*24*3600+elapsedTime.seconds)*10**6)/10**6
print("\033[10;0H\r")
print("\033[10;0H(" + now.strftime("%Y/%m/%d %H:%M:%S") + ") Sensors: %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s"%(pH1,pH2,Temp,RH,TDS1,TDS2,CO2,Light,Water,MagX,MagY,MagZ,TankTotal,Tank1,Tank2,Tank3,Tank4,WaterTempP1,WaterTempP2,WaterTempP3,WaterTempP4))
now = datetime.now()
delta = float(now.strftime('%s')) - float(LastDataPoint_Time.strftime('%s'))
if (delta < 0):
TimeString = LastDataPoint_Time.strftime("%Y-%m-%d %H:%M:%S")
update_sql("DELETE FROM Sensors_Log WHERE Time='" + TimeString + "'")
LastDataPoint_Time = datetime.now()
addMessageLog("Negative Delta - Deleting Last Record (Wrong Time?)")
printMessageLog()
if (delta >= TakeDataPoint_Every) or (Datapoint_count == 0 and first_timesync == True):
addMessageLog("Added a data point to the sensor values log.")
printMessageLog()
update_sql("INSERT INTO Sensors_Log (Time,pH1,pH2,Temp,RH,TDS1,TDS2,CO2,Light,Water,MagX,MagY,MagZ,TankTotal,Tank1,Tank2,Tank3,Tank4,WaterTempP1,WaterTempP2,WaterTempP3,WaterTempP4) VALUES ('" + now.strftime("%Y-%m-%d %H:%M:%S") + "'," + pH1 + "," + pH2+ "," + Temp + "," + RH + "," + TDS1 + "," + TDS2 + "," + CO2 + "," + Light + "," + Water + "," + MagX + "," + MagY + "," + MagZ + "," + TankTotal + "," + Tank1 + "," + Tank2 + "," + Tank3 + "," + Tank4 + "," + WaterTempP1 + "," + WaterTempP2 + "," + WaterTempP3 + "," + WaterTempP4 + ")")
LastDataPoint_Time = datetime.now()
timesync = 0 #do a timesync
Datapoint_count = Datapoint_count + 1
#SENSOR VALUES
update_sql("UPDATE `Sensors` SET pH1 = " + pH1 + ", pH2 = " + pH2 + ", Temp = " + Temp + ", RH = " + RH + ", TDS1 = " + TDS1 + ", TDS2 = " + TDS2 + ", CO2 = " + CO2 + ", Light = " + Light + ", Water = " + Water + ", MagX = " + MagX + ", MagY = " + MagY + ", MagZ = " + MagZ + ", TankTotal = " + TankTotal + ", Tank1 = " + Tank1 + ", Tank2 = " + Tank2 + ", Tank3 = " + Tank3 + ", Tank4 = " + Tank4 + ", WaterTempP1 = " + WaterTempP1 + ", WaterTempP2 = " + WaterTempP2 + ", WaterTempP3 = " + WaterTempP3 + ", WaterTempP4 = " + WaterTempP4 + "")
db.commit()
そのupdate_sql(フォーマットと右のトラックに私を設定するための任意の助けをいただければ幸い1064エラーがスローされます一番下に「UPDATE文字列。実行上記のコードシリアル文字列がで来るときシリアル文字列中の「センサー」。カンマで区切られたセンサーの測定値が続いている。コードが挿入けど更新していないとき、[OK]を動作するようです。事前に
おかげでここ
がフルエラーコード
ですTraceback (most recent call last):
File "yieldbuddy.py", line 1211, in <module>
serialerr=checkSerial()
File "yieldbuddy.py", line 481, in checkSerial
update_sql("UPDATE `Sensors` SET pH1 = " + pH1 + ", pH2 = " + pH2 + ", Temp = " + Temp + ", RH = " + RH + ", TDS1 = " + TDS1 + ", TDS2 = " + TDS2 + ", CO2 = " + CO2 + ", Light = " + Light + ", Water = " + Water + ", MagX = " + MagX + ", MagY = " + MagY + ", MagZ = " + MagZ + ", TankTotal = " + TankTotal + ", Tank1 = " + Tank1 + ", Tank2 = " + Tank2 + ", Tank3 = " + Tank3 + ", Tank4 = " + Tank4 + ", WaterTempP1 = " + WaterTempP1 + ", WaterTempP2 = " + WaterTempP2 + ", WaterTempP3 = " + WaterTempP3 + ", WaterTempP4 = " + WaterTempP4 + "")
File "yieldbuddy.py", line 33, in update_sql
cursor.execute(query)
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
self.errorhandler(self, exc, value)
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
_mysql_exceptions.ProgrammingError: (1064, "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 '' at line 1")
私はそれがステータス列であるとして、ステータスフィールドをrecogninzeていない何らかの理由で、次のコード
elif 'SetPoint_pH2' in line:
if oldSetPoint_pH2 != line:
oldSetPoint_pH2 = line
#print("%s"%(line)) For Debugging
SetPoint_pH2,pH2Value_Low,pH2Value_High,pH2_Status=line.split(",")
SetPoint_pH2 = SetPoint_pH2.replace("Read fail", "")
pH2_Status = pH2_Status.rstrip()
print("\033[16;0H ")
print("\033[16;0H(" + now.strftime("%Y/%m/%d %H:%M:%S") + ") SetPoint_pH2: %s,%s,%s"%(pH2Value_Low,pH2Value_High,pH2_Status))
#SetPoint_pH
# update_sql("UPDATE `pH2` SET Low='" + pH2Value_Low + "',High='" + pH2Value_High + "',Status='" + pH2_Status + "'")
update_sql("UPDATE `pH2` SET Low = {}, High = {}, Status = {}".format(pH2Value_Low,pH2Value_High,pH2_Status))
に到達するまで、私はこれが動作しているようだセットアップするには、以下のSQL UPDATE文を第三の例を使用している
その代わりにこのエラーをスローします。
(2016/08/07 12:10:42) SetPoint_pH2: -1.00,6.20,OK
Traceback (most recent call last):
File "yieldbuddy.py", line 1310, in <module>
serialerr=checkSerial()
File "yieldbuddy.py", line 607, in checkSerial
update_sql("UPDATE `pH2` SET Low = {}, High = {}, Status = {}".format(pH2Value_Low,pH2Value_High,pH2_Status))
File "yieldbuddy.py", line 33, in update_sql
cursor.execute(query)
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
self.errorhandler(self, exc, value)
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (1054, "Unknown column 'OK' in 'field list'")
私は、この行と私はすでに行っている他の人との違いを見ることができないよう、それは「実際に私が実際の列に入れたい値である列「OK」を使用しようとします状態"。
問題のクエリと完全なエラーメッセージを投稿した方が理にかなっていますか? – e4c5
update_sqlの前に "print"を置いて、出力するもの、動作するものと出力しないものを表示します。そしてyes @ e4c5は正しいです、エラーメッセージは役に立ちます – cox
また、SQLAlchemy;のようないくつかのDBMS-agnosticフレームワークを次回使用するための良い教訓です! –