[python] 1064 You have an error in your SQL syntax

Pagina: 1
Acties:
  • 430 views

Acties:
  • 0 Henk 'm!

  • Luppie
  • Registratie: September 2001
  • Laatst online: 14-08 07:27

Luppie

www.msxinfo.net

Topicstarter
Ik ben bezig om aan mijn database met meetwaardes van mijn slimme meter ook de temperatuur binnen en buiten toe te voegen om zodoende de correlatie tussen de temperatuur en gasverbruik inzichtelijk te maken.

Voor het inlezen van de gegevens van mijn slimme meter maak ik gebruik van het volgende script:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/env python
#
# DSMR P1 uitlezer
# (c) 10-2012 - GJ - gratis te kopieren en te plakken

versie = "1.0"
import sys
import serial

################
#Error display #
################
def show_error():
    ft = sys.exc_info()[0]
    fv = sys.exc_info()[1]
    print("Fout type: %s" % ft )
    print("Fout waarde: %s" % fv )
    return


################################################################################################################################################
#Main program
################################################################################################################################################
#print ("DSMR P1 uitlezer",  versie)
#print ("Control-C om te stoppen")


#Set COM port config
ser = serial.Serial()
ser.baudrate = 115200
ser.bytesize=serial.EIGHTBITS
ser.parity=serial.PARITY_NONE
ser.stopbits=serial.STOPBITS_ONE
ser.xonxoff=0
ser.rtscts=0
ser.timeout=20
ser.port="/dev/ttyAMA0"

#Open COM port
try:
    ser.open()
except:
    sys.exit ("Fout bij het openen van %s. Programma afgebroken."  % ser.name)


#Initialize
# stack is mijn list met de 20 regeltjes.
p1_teller=0
stack=[]

while p1_teller < 29:
    p1_line=''
#Read 1 line
    try:
        p1_raw = ser.readline()
    except:
        sys.exit ("Seriele poort %s kan niet gelezen worden. Programma afgebroken." % ser.name )
    p1_str=str(p1_raw)
    #p1_str=str(p1_raw, "utf-8")
    p1_line=p1_str.strip()
    stack.append(p1_line)
# als je alles wil zien moet je de volgende line uncommenten
#    print (p1_line)
    p1_teller = p1_teller +1

#Initialize
# stack_teller is mijn tellertje voor de 20 weer door te lopen. Waarschijnlijk mag ik die p1_teller ook gebruiken
stack_teller=0

while stack_teller < 29:
   if stack[stack_teller][0:9] == "1-0:1.8.1":
        dal = stack[stack_teller][10:20]
        print dal, "kWh"
   elif stack[stack_teller][0:9] == "1-0:1.8.2":
        piek = stack[stack_teller][10:20]
        print piek, "kWh"
# Huidige stroomafname: 1-0:1.7.0
   elif stack[stack_teller][0:9] == "1-0:1.7.0":
        huidig = stack[stack_teller][10:16]
        print huidig, "Watt"
# Gasmeter: 0-1:24.3.0
   elif stack[stack_teller][0:10] == "0-1:24.2.1":
        gas = stack[stack_teller][26:35]
        print gas, "m3"
   else:
        pass
   stack_teller = stack_teller +1

# Data inlezen in de Database
import MySQLdb as mdb
# warnings.filterwarnings('ignore', 'Data truncated for column .*')
con = mdb.connect('localhost', '******', '********', 'energie');

cur = con.cursor()

add_meting = ("INSERT INTO energie.tbl_meetwaarden "
              "(id, time, laag, hoog, huidig, gas) "
              "VALUES (NULL,NULL,%(dal)s, %(piek)s, %(huidig)s, %(gas)s)")

# Insert meting information
data_meting = {
  'dal': dal,
  'piek': piek,
  'huidig': int(float(huidig)*1000),
  'gas': gas,
}

print (add_meting, data_meting)
cur.execute(add_meting, data_meting)

con.commit()
cur.close()
con.close()

#Close port and show status
try:
    ser.close()
except:
    sys.exit ("Oops %s. Programma afgebroken." % ser.name )

Dit script werk helemaal goed. Dus heb dit script als uitgangspunt genomen om ook een temperatuur log script te maken. Ondanks dat (voor mij) op eerste gezicht alles hetzelfde lijkt, werkt het script niet en krijg ik de volgende foutmelding:
code:
1
2
3
4
5
6
7
8
9
('INSERT INTO energie.tbl_templog (id, time, temp_binnen, temp_buiten, hum_binnen) VALUES (NULL,NULL,%(temp_binnen)s, %(temp_buiten)s, %(hum_binnen)s ', {'temp_binnen': 21.75, 'hum_binnen': 0, 'temp_buiten': 9.94})
Traceback (most recent call last):
  File "templog.py", line 49, in <module>
    cur.execute(add_meting, data_meting)
  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")


Het temperatuurlog script, dat de foutmelding geeft:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import time

sensorids = ["28-000004cea41f", "28-000005e36d6c"]
avgtemperatures = []
for sensor in range(len(sensorids)):
        temperatures = []
        for polltime in range(0,3):
                        text = '';
                        while text.split("\n")[0].find("YES") == -1:
                                        tfile = open("/sys/bus/w1/devices/"+ sensorids[sensor] +"/w1_slave")
                                        text = tfile.read()
                                        tfile.close()
                                        time.sleep(1)

                        secondline = text.split("\n")[1]
                        temperaturedata = secondline.split(" ")[9]
                        temperature = float(temperaturedata[2:])
                        temperatures.append(temperature / 1000)

        avgtemperatures.append(sum(temperatures) / float(len(temperatures)))

buiten = "%.2f" % avgtemperatures[0]
binnen = "%.2f" % avgtemperatures[1]
hum = 0

# Data inlezen in de Database
import MySQLdb as mdb

con = mdb.connect('localhost', '*******', '*******', 'energie');
cur = con.cursor()

add_meting = ("INSERT INTO energie.tbl_templog "
"(id, time, temp_binnen, temp_buiten, hum_binnen) "
"VALUES (NULL,NULL,%(temp_binnen)s, %(temp_buiten)s, %(hum_binnen)s ")

# Meeting Informatie Toevoegen
data_meting = {
'temp_binnen': float(binnen),
'temp_buiten': float(buiten),
'hum_binnen': int(hum),
}

print (add_meting, data_meting)

cur.execute(add_meting, data_meting)

con.commit()
cur.close()
con.close()


In beide scripts heb ik de regel : print (add_meting, data_meting) toegevoegd om te controleren hoe de INSERT plaats vindt

Niet werkend:
code:
1
('INSERT INTO energie.tbl_templog (id, time, temp_binnen, temp_buiten, hum_binnen) VALUES (NULL,NULL,%(temp_binnen)s, %(temp_buiten)s, %(hum_binnen)s ', {'temp_binnen': '21.75', 'hum_binnen': 0, 'temp_buiten': '9.88'})


Wel werkend:
code:
1
('INSERT INTO energie.tbl_meetwaarden (id, time, laag, hoog, huidig, gas) VALUES (NULL,NULL,%(dal)s, %(piek)s, %(huidig)s, %(gas)s)', {'dal': '000076.570', 'huidig': 669, 'gas': '00022.720', 'piek': '000000.000'})


Dit zijn de tabbellen, waar de data ingelezen wordt:
tbl_meetwaarden:
Afbeeldingslocatie: http://upload.luppie.net/images/2015/03/22/tblmeetwaarden.jpg

tbl_templog
Afbeeldingslocatie: http://upload.luppie.net/images/2015/03/22/tbltemplog.jpg

Zelf heb ik al geprobeerd om de waardes om te zetten naar float en integer. Ook heb ik geprobeerd om de tabel in te stellen als varchar en vervolgens de data als string in te lezen, echter zonder succes.

Zelf denk ik dat het niet aan het datatype ligt, bij een verkeerd datatype krijg ik nl. een formatting error, terwijl nu er iets fout zou zijn in de syntax. Misschien loop ik me er al te lang op blind te staren, maar ik zie het dus echt niet.

Heb je iets aan mijn antwoord ? Een thumbs-up wordt zeker op prijs gesteld.


Acties:
  • 0 Henk 'm!

  • L01
  • Registratie: December 2003
  • Laatst online: 07:55

L01

[code=sql]

%(hum_binnen)s '

[/code]

Die single quote valt me op, waar is die van?


nvm :)

[ Voor 10% gewijzigd door L01 op 22-03-2015 20:56 ]

Hi, I'm a signature virus. Put me in your signature to help me spread.


Acties:
  • 0 Henk 'm!

  • Luppie
  • Registratie: September 2001
  • Laatst online: 14-08 07:27

Luppie

www.msxinfo.net

Topicstarter
Dat is de afsluitende quote van:
SQL:
1
'INSERT INTO

Heb je iets aan mijn antwoord ? Een thumbs-up wordt zeker op prijs gesteld.


Acties:
  • 0 Henk 'm!

  • TallManNL
  • Registratie: Oktober 2005
  • Laatst online: 09-10 17:59
Maak van
code:
1
2
3
add_meting = ("INSERT INTO energie.tbl_templog "
"(id, time, temp_binnen, temp_buiten, hum_binnen) "
"VALUES (NULL,NULL,%(temp_binnen)s, %(temp_buiten)s, %(hum_binnen)s ")

code:
1
2
3
add_meting = ("INSERT INTO energie.tbl_templog "
"(id, time, temp_binnen, temp_buiten, hum_binnen) "
"VALUES (NULL,NULL,%(temp_binnen)s, %(temp_buiten)s, %(hum_binnen)s) ")


Let op de afsluitende )

geheelonthouder met geheugenverlies


Acties:
  • 0 Henk 'm!

  • Luppie
  • Registratie: September 2001
  • Laatst online: 14-08 07:27

Luppie

www.msxinfo.net

Topicstarter
Geloof het of niet, maar zelfs als ik beide naast elkaar bekijk, zie ik het ) niet.

Yes, dat is hem.
Dank je wel _/-\o_

Heb je iets aan mijn antwoord ? Een thumbs-up wordt zeker op prijs gesteld.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Fijn dat je geholpen bent, maar syntaxfouten moet je over het algemeen toch echt zelf kunnen vinden. Dat is vrijwel altijd een kwestie van haakjes of puntkomma's tellen. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.