A megoldas:
now = datetime.now()
formatted_date = now.strftime('%Y-%m-%d %H:%M:%S.%f')
mycursor.execute("INSERT INTO proba (datum) VALUES (%s)", (now.strftime('%Y-%m-%d %H:%M:%S.%f'),))
Sziasztok!
Kezdo vagyok mysql-ben, ezt szeretnem az elejen kijelenteni, hatha fontos lesz a kesobbiekben. :D
Van egy hazi projektem, ahol belefutottam az elso komoly problemaba...
Feladat:
Raspberry pi 4-en fut egy python script, ami adott beerkezo jelre keszit egy datetime.now() idot, ilyen formatumban: 2021-02-16 10:51:12.542145
Ezt az idot szeretnem elkuldeni egy tavoli mysql tablaba, de folyamatosan syntax error-ba futok bele. Fontos, hogy szuksegem van a tizedes pont utani elso, de inkabb elso ketto karakterre(mar az elsonek is nagyon orulnek).
Vas amin a python fut: Raspberry pi 4 2GB model OS: Raspberry pi OS
Vas amin a mysql fut: Ubuntu 20.04.1LTS
Az adatok kuldes rendben van, ez a resze jo a kodnak, csak a datum helyes formatuma nem oke, gondolom en...(ha pl stringet kuldok az atmegy, ott a tabla datatype-ja varchar ebben az esetben)
A mysql maunalban az alabbi modon szerepel a datetime formatum:
Röviden: YYYY-MM-DD hh:mm:ss - tehat az en ertelmezesemben ebben a formaban kell hogy megkapja az erteket, hogy megfelelo legyen neki (ebben kernek egy megerositest)
Az altalam leirt pelda datumra nezve:
%Y -- ev 4 digites formaban (2021)
%m -- honap 2 digites formaban (02)
%d -- nap 2 digites (16)
%H -- ora 2 digites 0-23 (10)
%i -- perc 2 digites 0-59 (51)
%S -- masodperc 0-59 (12)
%f -- microsec 000000-999999 (542145)
Ebben is jo lenne egy megerosites, hogy ezt kell-e kuldenem neki egyeltalan...
Fogom a mysql-t letrehozom az adatbazisban a tablat, a tablaban az oszlopot(ez az egy oszlop szerepel csak benne). Beallitom a DATETIME(6)-t, es keszen is vagyok. DATETIME(4)-re pl csak 2 digites lesz a tort resz --> 10:51:12.00
Jojjon a python script:
Letrehozom az aktualis idot a datetime.now()-al. Probaltam igy siman a datetime formatumaval is elkuldeni, de nem ment, ezert google alapjan ez az "ujra formazott" ido formatum elvben mukodik, igy ezzel probalkoztam ez lett a formatted_date valtozo.
now = datetime.now()
formatted_date = now.strftime('%Y-%m-d %H:%M:%S.%f') --> ez ugye a pythonban levo formatum ez nem ismeri a mysql %i formatumat
Tehat, a fenti sorral az en ertelmezesem szerint eloallitottam a szukseges datumido formatumot. Ugye?
Jojjon a kuldes:
A teoriam az hogy definialom a mysql-nek hogy amit kapni fog, azt hogyan kell ertelmezni --> (%Y-%m-%d %H:%i:%S.%f)
mycursor.execute(INSERT INTO proba (datum) VALUES (%Y-%m-%d %H:%i:%S.%f)", (formatted_date)) --> ezzel syntax error van
mycursor.execute(INSERT INTO proba (datum) VALUES ('%Y-%m-%d %H:%i:%S.%f')", (formatted_date)) --> ezzel syntax error van, itt '' koze tettem a datum formatum jelolot, hogy "egy adatkent kezelje", de nem jott be
mycursor.execute(INSERT INTO proba (datum) VALUES", (formatted_date)) --> ezzel is syntax error van
mycursor.execute("INSERT INTO proba (datum) VALUES (localtime)") --> ez mukodik, de ez a mysql serveren futo idot keri le
mycursor.execute("INSERT INTO proba (datum) VALUES (datetime.now())") --> ezzel access denied error-al fut hibara, gondolom ez hasonloan a localtime-hoz a mysql server idejet kerne le
Mindenkeppen szuksegem van a tizedes reszbol 1 vagy 2 digitre, mert 1 masodperc alatt erkezhet 2-3 jel is, es most ebben az esetben a mysql hibara fut, hogy duplicate van. Mivel ugye csak ez ez egy oszlop van a tablaba, igy ez a primary key is abbol meg ugye nem lehet ketto vagy tobb egyforma. Csak ezert hogy mondjuk egy ID oszlopot betegyek hogy lehessen 2 vagy tobb azonos datumido nem szeretnek, illetve feleslegesnek tartom.
Eros a gyanum, ha jol ertem a manual-t, akkor a megoldas itt van elottem, csak nincs meg a szintaktika, hogy hogyan kuldjem el a tablaba.
Szerk.:
Itt a hiba uzenet, hatha valakinek segit:
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 '%Y-%m-%d %H:%i:%S.%f)' at line 1
A valaszokat elore is koszonom!
- 120 megtekintés
Hozzászólások
formatted_date = now.strftime('%Y-%m-d %H:%M:S.%f')
helyett
formatted_date = now.strftime('%Y-%m-%d %H:%M:%S.%f')
Ekkor mi a helyzet?
- A hozzászóláshoz be kell jelentkezni
Bocsanat, az egy elgepeles volt, de ugyan az syntax error van.
- A hozzászóláshoz be kell jelentkezni
Szerk.: Betettem az eredeti reszbe a hibauzenetet is.
- A hozzászóláshoz be kell jelentkezni
Gyanús, hogy hibásan adod át a paramétereket. Az utolsónak így kellene kinéznie:
mycursor.execute("INSERT INTO proba (datum) VALUES (?)", (datetime.now(),))
- A hozzászóláshoz be kell jelentkezni
Koszonom a valaszt, de erre is syntax error van. Illetve itt '%s' --> ezzel nem csak 1db erteket kuld el?
- A hozzászóláshoz be kell jelentkezni
Valóban, elírtam, de így már jó lesz:
mycursor.execute("INSERT INTO proba (datum) VALUES (?)", (now.strftime('%Y-%m-d %H:%M:%S.%f'),))
- A hozzászóláshoz be kell jelentkezni
Alakul, ennyi a nyuge most mar csak:
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 '2021-02-d 12:33:55.779755'')' at line 1
Szerk:
A nap nem jon at jol, illetve a masodperc tort resze nem jo meg.
Szerk:
A napra megvan a hiba, ott lemaradt a % jel.
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 '2021-02-16 12:55:04.193278'')' at line 1
Mar csak erre a masodperc tort reszre kellene valakitol valami okossag! :)
Szerk:
En vagyok a lama, bocsanat... - mycursor.execute("INSERT INTO proba (datum) VALUES (?)", (now.strftime('%Y-%m-d %H:%M:%S.%f'),)) itt a %s-t idezojelbe tettem. Ezt javitva es a %d javitva, es mar mukodik is.
Ezer hala! Koszonom!
- A hozzászóláshoz be kell jelentkezni
Itt a kodom:
34 try:
35 while True:
36 if GPIO.input(4):
37 now = datetime.now()
38 formatted_date = now.strftime('%Y-%m-%d %H:%M:%S.%f')
39 mycursor.execute("INSERT INTO proba (datum) VALUES (%Y-%m-%d %H:%i:%S.%f)", (formatted_date))
40 db.commit()
41 GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
42 print(now)
43 sleep(0.1)
44
- A hozzászóláshoz be kell jelentkezni