2013-06-11 9 views
9

Próbuję wstawić zmienną Pythona do tabeli MySQL w skrypcie Pythona, ale nie działa. Oto mój kodZłącze MySQL/Python - wstaw zmienną Pythona do tabeli MySQL

add_results=("INSERT INTO account_cancel_predictions" 
      "(account_id,21_day_probability,flagged)" 
      "Values(%(account_id)s,%(21_day_probability)s,%(flagged)s)") 

data_result={ 
    'account_id':result[1,0], 
    '21_day_probability':result[1,1], 
    'flagged':result[1,2] 
} 

cursor.execute(add_results,data_result) 

cnx.commit() 
cursor.close() 
cnx.close() 

To dostaje błąd

ProgrammingError: Failed processing pyformat-parameters; 'MySQLConverter' object has no attribute '_float64_to_mysql' 

Jednak, kiedy wymienić nazwy zmiennych result[1,0], result[1,1] i result[1,2] z ich rzeczywistych wartości liczbowych to działa. Podejrzewam, że Python przekazuje rzeczywiste nazwy zmiennych zamiast ich wartości. Jak to naprawić?

+0

Ktoś? ........ – user1893354

+0

połączenie = engine.connect() connection.execute ("" "update Gracze ustawili Gold = (?), Gdzie Name = (?)" "" (Złoto, nazwa)), może po prostu fanboy rzecz, ale mam tendencję do używania sqlalchemy z python i to zwykle upraszcza wiele z tego i nigdy nie miałem problemów z użyciem symboli wieloznacznych z nim – theBigChalk

Odpowiedz

18

Zakładając, że używasz mysql.connector (myślę, że jesteś), definiować własne klasy konwerter:

class NumpyMySQLConverter(mysql.connector.conversion.MySQLConverter): 
    """ A mysql.connector Converter that handles Numpy types """ 

    def _float32_to_mysql(self, value): 
     return float(value) 

    def _float64_to_mysql(self, value): 
     return float(value) 

    def _int32_to_mysql(self, value): 
     return int(value) 

    def _int64_to_mysql(self, value): 
     return int(value) 

config = { 
    'user' : 'user', 
    'host' : 'localhost', 
    'password': 'xxx', 
    'database': 'db1' 
} 

conn = mysql.connector.connect(**config) 
conn.set_converter_class(NumpyMySQLConverter) 
+1

Ładne rozwiązanie! Musiałem jednak włączyć funkcję '__init__', aby działała. Może to być spowodowane moją wersją. Użyłem czegoś podobnego do oryginalnej klasy 'MySQLConverter' w' conversion.py'. – regeirk

3

Jedna z podanych wartości może być typu numpy.float64, która nie jest rozpoznawana przez złącze MySQL. Rzuć go do prawdziwego pytona float o wypełnienie dyktatu.

0

Jeśli jesteś na Pythona 3 i powyżej, wystarczy użyć mysqlclient pip install mysqlclient. Jest zalecane przez django, a wszystkie inne sterowniki są złe.