MEGOLDVA python datetime.now() to mysql datetime(6) == syntax error

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)

 

Ahhoz hogy ebben a formaban kapja meg az ertekeket, ahhoz szinten a manual alapjan igy kell megkapnia:

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!

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?

Szerk.: Betettem az eredeti reszbe a hibauzenetet is.

Szerkesztve: 2021. 02. 16., k – 12:26

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(),)) 

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!

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