Executarea MySQLdb

Am căutat pe site și pe multe altele și am găsit întrebări similare, dar niciunul dintre răspunsuri nu a lucrat pentru mine (de obicei, doar pentru contabilitatea tuplei). Scriu un script python pentru a analiza paginile html și pentru a popula o bază de date. Am aproape tot ceea ce lucrez, cu excepția părții populate ...

Aici este segmentul de cod care se ocupă de baza de date mySQL (notă: folosind modulul MySQLdb în Python)

conn = MySQLdb.connect(user="root", passwd="xxxxx",db="nutrients")
cur = conn.cursor()
test = "Canned Corn"
cur.execute("INSERT INTO food (name) VALUES (%s)", (test,))
conn.commit()

Testaam mai întâi cu șirul pars, dar asta nu funcționa. Acest lucru îmi dă două erori:

  1. Traceback (ultimul apel ultimul):   Fișierul "C: \ Python32 \ lib \ site-packages \ MySQLdb \ cursors.py", linia 171, în execuție     r = auto.query (interogare)   Fișierul "C: \ Python32 \ lib \ site-packages \ MySQLdb \ cursors.py", linia 330, în _query     rowcount = self._do_query (q)   Fișierul "C: \ Python32 \ lib \ site-packages \ MySQLdb \ cursors.py", linia 294, în _do_query     db.query (q) _mysql_exceptions.ProgrammingError: (1064, "Aveți o eroare în sintaxa SQL ; verificați manualul care corespunde versiunii serverului dvs. MySQL pentru dreptul de acces yntax pentru a utiliza aproape de '% s' la linia 1)

  2. Traceback (ultimul apel ultimul):   Fișierul "C: \ Python32 \ lib \ site-packages \ MySQLdb \ cursors.py", linia 171, în execuție     r = auto.query (interogare)   Fișierul "C: \ Python32 \ lib \ site-packages \ MySQLdb \ cursors.py", linia 330, în _query     rowcount = self._do_query (q)   Fișierul "C: \ Python32 \ lib \ site-packages \ MySQLdb \ cursors.py", linia 294, în _do_query     db.query (q) _mysql_exceptions.ProgrammingError: (1064, "Aveți o eroare în sintaxa SQL ; verificați manualul care corespunde versiunii serverului dvs. MySQL pentru dreptul de acces yntax pentru a utiliza aproape de '% s' la linia 1)

De ce această interogare nu funcționează !?


Actualizare: După ce mi-am tras aproape părul, m-am decis să revin la 2.7.3 și să ghicesc ce ... totul funcționează acum: D Ar fi trebuit să știi că a fost o eroare de acel tip ... Mulțumesc pentru ajutor oricum oricine!

0
Problemele pare să nu fie în sintaxa SQL, însă % s nu este înlocuită cu valoarea test .
adăugat autor Lev Levitsky, sursa
Sunteți sigur că executați exact același cod pe care îl afișați? Această eroare s-ar putea întâmpla dacă ați uitat să transmiteți (test,) ca al doilea argument pentru execute sau dacă aveți un alt % s .
adăugat autor Lev Levitsky, sursa
Poate încercați să pisați șirul în interior după cum urmează: str = "INSERT IN food (name) VALUES" + test și apoi cur.execute (str)
adăugat autor Florin Stingaciu, sursa
@ jcho360 nu este nu, dar eu, deși ai putea specifica doar o coloană și datele din SQL
adăugat autor Odub, sursa
@ user145896 este numele singurei coloane pe care o aveți în tabelul dvs.?
adăugat autor jcho360, sursa

3 răspunsuri

Cred că nu aveți nevoie de nici un SQL complicat sau avansat; trebuie doar să stocați și să preluați anumite lucruri. Deci, cred că un ORM ar putea face viața mult mai ușoară pentru tine.

Vă sugerez să încercați să utilizați ORM-ul de toamnă:

http://pypi.python.org/pypi/autumn/0.5.1

Acesta este un ORM mic și simplu, ușor de înțeles și de utilizat.

Un alt ORM bun și popular pentru Python este SQLAlchemy:

http://www.sqlalchemy.org/

0
adăugat
Vă mulțumim pentru recomandări, ați încercat SQLAlchemy și am obținut literalmente aceeași eroare. Mi-a placut sqlalchemy asa ca o folosesc acum :)
adăugat autor Odub, sursa

Ar trebui să scrieți codul în felul următor:

 conn = MySQLdb.connect(user="root", passwd="xxxxx",db="nutrients")
 cur = conn.cursor()
 test = "Canned Corn"
 cur.execute("INSERT INTO food (name) VALUES (%s)" % (test,) )
 conn.commit()

Dacă sunteți nou la Python și aveți experiență de programare, urmați cartea Dive Into Python . Este gratis.

0
adăugat
Nu folosiți% conduce la injecții sql?
adăugat autor Odub, sursa
@Manish - Ummm, ar trebui să încercați întotdeauna întotdeauna să protejați împotriva injecțiilor SQL.
adăugat autor RustyTheBoyRobot, sursa
Aceasta este doar o practică bună.
adăugat autor RustyTheBoyRobot, sursa
De ce ți-e atât de mult frică de injectare sql.Its tu databse și o folosești pentru tine (sper așa). Și dacă injecția SQL poate fi aplicată aici, atunci de ce nu în codul dvs. utilizând virgula ???
adăugat autor Manish, sursa
@RustyTheBoyRobot: Stiu dar nu am obtine cum% este mai predispus la injectarea sql si nu, folosind sintaxa.
adăugat autor Manish, sursa
@Manish - cur.execute() evită caracterele speciale MySQL înainte de formatare. % și ". format() nu știu nimic despre caracterele speciale MySQL.
adăugat autor James Wood, sursa
Deși este mai bine să ne gândim mai degrabă la dezinfectarea fragmentelor SQL decât la paranoia injectabilă, cea mai mare eroare aici este că utilizarea codului % nu are efect de evadare MySQL.
adăugat autor Jonathan Neufeld, sursa

Tocmai am trecut peste asta. După o mulțime de săpătură în jurul valorii de, acest lucru a fost găsit să funcționeze (notați schimbarea la valori):

conn = MySQLdb.connect(user="root", passwd="xxxxx",db="nutrients")
cur = conn.cursor()
test = "Canned Corn"
cur.execute("INSERT INTO food (name) VALUES ({0})", (test,))
conn.commit()

Informații de fundal: în portul MySQLdb către Python 3 postat pe un pachete Python neoficiale site-ul, funcția execute în cursors.py a fost modificată pentru a utiliza formatul() mai degrabă decât operatorul%. Prin urmare, motivul pentru care% s rămâne în instrucțiunea SQL și nu este înlocuit. Se pare că aceste modificări nu au fost niciodată integrate în versiunea sursa oficiala .

0
adăugat
Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.

MySQL - comunitatea Română
MySQL - comunitatea Română
19 participanți

Comunitatea română a programatorilor MySQL.