2009-09-20 20 views
9

Jestem nowym użytkownikiem Pythona i Pythona MySQL. Nie jestem pewien, czy brakuje mi czegoś oczywistego:Python MySQL - WYBIERA pracę, ale nie DELETE?

db = MySQLdb.connect(# db details omitted) 
cursor = self.db.cursor() 

# WORKS 
cursor.execute("SELECT site_id FROM users WHERE username=%s", (username)) 
record = cursor.fetchone() 

# DOES NOT SEEM TO WORK 
cursor.execute("DELETE FROM users WHERE username=%s", (username)) 

Jakieś pomysły?

+3

przywileje co masz na bazach danych? – ennuikiller

+0

tak, upewnij się, że użytkownik, z którego korzystasz, ma prawo do usuwania wierszy. –

+0

Kiedy mówisz "NIE WIDZI DO PRACY": skąd wiesz? Czy otrzymujesz komunikat o błędzie? Jeśli tak, to jaki? Prosimy o zgłaszanie wszystkich szczegółów z góry. –

Odpowiedz

12

Domyślam się, że używasz silnika pamięci masowej obsługującego transakcje (np. InnoDB), ale po DELETE nie dzwonisz pod numer db.commit(). Efekt DELETE jest odrzucany, jeśli nie zatwierdzasz.

Patrz http://mysql-python.sourceforge.net/FAQ.html#my-data-disappeared-or-won-t-go-away:

Począwszy 1.2.0 MySQLdb wyłącza trybu automatycznego domyślnie, zgodnie standard DB API (PPG-249). Jeśli używasz tabel InnoDB lub inny rodzaj transakcji typu tabeli, musisz zrobić connection.commit() przed zamknięciem połączenia, albo żaden z wprowadzonych zmian będą zapisywane do bazy danych.

Zobacz także Podobny SO pytanie: Python MySQLdb update query fails

+0

Bingo! Jest to specyficzna dla Pythona rzecz, której szukałem, ponieważ powyższe rozwiązanie działałoby w prosty sposób w PHP lub Ruby bez problemu. Dzięki chłopaki! –

+0

złamałem sobie głowę tym wczorajszym ... Przez chwilę zastanawiałem się, dlaczego. Czy sądzisz, że istnieje wzrost wydajności polegający na tym, że popełniasz wszystko naraz? tj. zamiast usuwać dla każdej instancji pętli for, popełniając na końcu przed zamknięciem? – Cmag

+1

Tak, zdecydowanie zwiększa się wydajność. Na przykład, domyślna konfiguracja dla InnoDB powoduje 'fsync()' po każdym zatwierdzeniu transakcji. Zobacz http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit –

0

do kodu powyżej, wystarczy dodać wywołanie self.db.commit().

Funkcja jest daleko od irytacji:

To pozwala uniknąć uszkodzenia danych wydaje gdy istnieją błędy w zapytaniach.

1

Być może naruszasz ograniczenie dotyczące klucza obcego.

0

Problem może polegać na tym, że nie wprowadzasz zmian. można to zrobić przez conn.commit()

przeczytać więcej na ten temat here