2016-03-22 10 views
1

Ich mache eine Datenbank-Klasse in Python, um bei der Verwaltung meiner MySQL-Datenbank zu helfen.Erstellen einer Klasse in Python mit mysqldb

Der Code unten bis zur letzten Zeile arbeitet

import MySQLdb 

class Database: 
    ... 

    def insert(self, query): 
     try: 
      self.cursor.execute(query) 
      self.connection.commit() 
     except: 
      self.connection.rollback() 
    ... 

db = Database() 
db.insert('INSERT INTO items (title) VALUES ("tester2");') 
mystring = "TEST" 
db.insert('INSERT INTO items (title) VALUES (%s);', mystring) 

Die letzte Zeile verursacht den Fehler:

db.insert('INSERT INTO items (title) VALUES (%s);', mystring) 
TypeError: insert() takes exactly 2 arguments (3 given) 

habe ich versucht, den Inhalt innerhalb der db.insert des Pars neu zu ordnen, aber ich kann nicht verstehen aus der Syntax.

Zum Beispiel habe ich versucht, dies als gut, aber es weder Einlagen noch gibt einen Fehler:

db.insert('''"INSERT INTO items (title) VALUES (%s);", mystring''') 

Meine Frage ist, kann ich die Syntax rechts, um erhalten legen Sie das% s, oder ich tue muss ich die Einfügefunktion meiner Klasse ändern?

EDIT 1

ich die vorgeschlagenen Linien versucht:

db.insert("INSERT INTO items (title) VALUES (%s);"% mystring) 

und

db.insert('INSERT INTO items (title) VALUES {value};'.format(value=mystring)) 

gab weder Fehler noch einen Wert in die Datenbank inputed

EDIT 2

Whole-Code für Haupt, dass die Datenbank-Klasse aufruft:

wenn Name == "Haupt":

db = Database() 
mystring = 'Tester1' 
mystring2 = 'Tester2' 
db.insert('INSERT INTO items (title) VALUES ("Tester3");') #works 
db.insert("INSERT INTO items (title) VALUES (%s);" % mystring) #does not work 
db.insert('INSERT INTO items (title) VALUES {value};'.format(value=mystring2)) #does not work 
print db.query('SELECT * FROM items;') 
+0

Sie gerade in der Zeichenfolge übergeben wollen – Bahrom

+0

'db = Database' wo ist die Klammern? – haifzhan

+0

@ Haifzhan du hast Recht, repariert es, (es war korrekt in meinem Code) – Rorschach

Antwort

3

Edit:

Das Problem, das Sie haben nicht nur ein Argument übergeben. sondern auch den Aufruf execute() falsch: self.cursor.execute('INSERT INTO items (title) VALUES (%s);', (mystring,))

Ursprüngliche Antwort:

Sie müssen passieren nur ein Argument query

insert_stat ="INSERT INTO employees (emp_no, first_name, last_name, hire_date) VALUES (%s, %s, %s, %s)" 
data = (2, 'Jane', 'Doe', datetime.date(2012, 3, 23)) 
# execute() takes 2 arguments, first is the statement as above, second argument is a tuple which contains all values 
cursor.execute(insert_stmt, data) 

In Ihrem Fall sollte es etwas aussehen wie sein.Daher können Sie Ihre Abfrage als eine Zeichenfolge wie folgt formatiert:

'INSERT INTO items (title) VALUES {value};'.format(value=mystring)

Änderung db.insert('INSERT INTO items (title) VALUES (%s);', mystring) zu db.insert('INSERT INTO items (title) VALUES {value};'.format(value=mystring))

0

Versuchen Sie folgendes: db.insert("INSERT INTO items (title) VALUES (%s);" % mystring) Grundsätzlich Sie wollen mystring als Teil der Abfragezeichenfolge, kein separater Parameter.

+0

hinzu, das gab: db.insert ('"INSERT INTO items (Titel) VALUES (% s); "% mystring) ^ SyntaxError: EOL beim Scannen von String-Literal – Rorschach

+0

Whoops extra Zitat, Entschuldigung auf dem Telefon, erstes Zitat entfernen. Siehe aktualisierte Antwort. – Bahrom