Forum >> Programmazione Python >> Database >> scrivere un valore ottenuto in un database

Pagina: 1 2 Avanti

Ciao a tutti,
sono nuovo del forum e ho intrapreso da poco il linguaggio python.
Ho una domanda....eseguo il primo script e nessun problema. Il valore che ottengo stampato dovrei scriverlo in un database nel mio caso mysql. ho scritto anche lo script per la scrittura nel database con un valore di test e nessun problema. Non riesco a collegarli e scrivere in automatico il valore ottenuto nel database


SCRIPT DOVE OTTENGO IL VALORE:

import sys

f = open('/dev/hidraw0','rb') #leggo il dispositivo
data = ''
while 1:
buffer = f.read(10) #leggo il valore del dispositivo
for char in buffer:
if ord(char):
output = int("0x"+str(ord(char)),base=16) + 1 #conversione del valore in intero
print chr(output)

SCRIPT DI SCRITTURA NEL DB:

import MySQLdb

db = MySQLdb.connect("localhost", "utente", "password", "nome db")
curs=db.cursor()

try:
curs.execute ("""insert into nometabella(nomecolonna) values("test")""")
db.commit()
print "comando inviato"
except:
print "errore query"
db.rollback()

db.close()

per farmi capire meglio io dovrei sostituire il valore test con il valore stampato chr(output)

Grazie mille per le eventuali risposte!!!
Ciao a te e benvenuto.

Per scrivere codice Python in questo forum, devi usare il pulsante code che trovi in alto, vicino alla tavolazza dei colori, quando sei in inserimento testo.



Anche se non hai specificato che tipo di errore ottieni, per l'inserimento nel DB dovresti usare qualcosa tipo:
curs.execute("""INSERT INTO nometabella(nomecolonna) VALUES (%s)""",(tuo_valore_da_inserire))
Fai sapere.
Daniele
scusate per l'errore!!
questo è lo script contenuto al'interno de file prova.py:

import sys

f = open('/dev/hidraw0','rb') #leggo il dispositivo
data = ''
while 1:
        buffer = f.read(8) #leggo il valore del dispositivo
        for char in buffer:
                if ord(char):
                        output  = int("0x"+str(ord(char)),base=16) + 1 #conversione del valore in intero
                        print chr(output)
                if chr(output)>0:
import MySQLdb

db = MySQLdb.connect("localhost", "utente", "password", "home")
curs=db.cursor()

try:
        curs.execute ("""insert into nometabella(nomecolonna) values(%s)""", (chr(output)))
        db.commit()
        print "comando inviato"
except:
        print "errore"
        db.rollback()
db.close()

e questo è il messaggio di errore che mi viene stampato:

 File "prova.py", line 12
    import MySQLdb
    ^
IndentationError: expected an indented block


 File "prova.py", line 12
    import MySQLdb
    ^
IndentationError: expected an indented block

Sposta import MySQLdb ad inizio file o dai comunque un invio prima della riga dove lo importi, per staccarlo dal blocco precedente.

Cya
Grazie per il consiglio era la prima volta che facevo uno script con due import. INCOMINCIA A FUNZIONARE!!!!
import sys
import MySQLdb

f = open('/dev/hidraw0','rb') #leggo il dispositivo
data = ''
while 1:
        buffer  = f.read(16) #leggo il valore del dispositivo
        for char in buffer:
                if ord(char):
                        output  = int("0x"+str(ord(char)),base=16) + 1 #conversione del valore in intero
                        a = chr(output)

        db = MySQLdb.connect("localhost", "utente", "password", "home") #connessione a db
        curs=db.cursor()

        try:
                curs.execute ("""insert into nometabella(nomecolonna) values(%s)""",(a)) #eseguo query
                db.commit()

                print "comando inviato"

        except:
                print "comando non inviato"

        db.rollback()

        db.close()

riesco a leggere i valori dal dispositivo nel mio caso una pistola barcode e scrivere la variabile a nel db. Adesso il bug è che i valori non vengono inseriti tutti in una row ma viene creata una row per ogni valore, nel mio caso vengono create 14 rows perchè il barcode è formato da 14 numeri. Per adesso ottimo risultato!
purtroppo non riesco a trovare una soluzione data dalla mia inesperienza.....tutte le prove che faccio non portano da nessuna parte. Non riesco a ragruppare tutti i valori ottenuti in un'unica stringa ma mi vengono stampati uno alla volta. Potete darmi una dritta così da poter trovare la soluzione? Grazieeee
purtroppo non riesco a trovare una soluzione data dalla mia inesperienza.....tutte le prove che faccio non portano da nessuna parte. Non riesco a ragruppare tutti i valori ottenuti in un'unica stringa ma mi vengono stampati uno alla volta. Potete darmi una dritta così da poter trovare la soluzione? Grazieeee
Puoi semplicemente usare il ciclo per creare un oggetto (lista, tupla, etc...) e poi inserire i dati in un secondo momento. Ottenendo ad esempio una lista, potresti accedere ad ogni singolo elemento della con lista[0], lista[1], lista[n]... e compilare in questo modo la tua query.

Prova e facci sapere quando risolvi.

Cya


--- Ultima modifica di Daniele aka Palmux in data 2018-02-14 12:39:50 ---
Ci sono quasi :)
import sys
import MySQLdb

f = open('/dev/hidraw0','rb') #leggo il dispositivo
lista = []
i = 0

db = MySQLdb.connect("localhost", "utente", "password", "nome_db")
curs=db.cursor()

while 1 == 1 :
        buffer  = f.read(16) #leggo il valore del dispositivo
        for char in buffer:
                if ord(char):
                        output  = int("0x"+str(ord(char)),base=16) + 1 #conversione del valore in intero
                        a = [chr(output)]
                        i = i + 1
                if i == 1:
                        b = lista + a
                elif i == 2:
                        c = b + a
                elif i == 3:
                        d = c + a
                elif i == 4:
                        e = d + a
                elif i == 5:
                        r = e + a
                elif i == 6:
                        g = r + a
                elif i == 7:
                        h = g + a
                elif i == 8:
                        l = h + a
                elif i == 9:
                        m = l + a
                elif i == 10:
                        n = m + a
                elif i == 11:
                        o = n + a
                elif i == 12:
                        p = o + a
                elif i == 13:
                        q = p + a
                elif i == 14:
                        i = 0
                        print q

                        curs.execute ("""insert into nome_tabella(nome_colonna) values(%s)""", q0)

                        db.commit()

                        print "comando inviato"


db.rollback()

db.close()

questo è lo script dove ho avuto dei risultati. Creo la lista la stampo su monitor e mi collego correttamente al db scrivendo l'elemento con indice 0. Il problema è che non riesco a inserire tutta la lista nella query.....
ho provato in vari modi ma senza risultato.
- """, q0, q1, qn)
- """, (q0, q1, qn))
- """, (q0), (q1), (qn)))

Sicuramente creo un errore nella sintassi o per inserire più elementi di una lista non è il modo corretto.
Attendo consigli Grazieee
Ci sono alcune cose che non vanno bene:
1. while 1 == 1 anche se non è sbagliato in senso assoluto, è perlomeno ridondante, meglio while 1;
2. L'indentazione delle query di inserimento non è corretta. In questo modo inserisci nel DB solo quando i == 14 e non è quello che vuoi;
3. Perché fai il rollback, sai a cosa serve?

Non ho controllato la sintassi esatta, quel compito lo lascio a te, ma controlla quanto ti ho scritto e vedrai che perlomeno i dati al DB li mandi.

Cya
Rileggendo bene Mysql avevo frainteso rollback pensando che terminasse solo la transazione invece la termina e annulla. In questo caso credo proprio non mi serva. Grazie per la precisazione e appena faccio le modifiche farò sapere cosa succede. :ok:


Pagina: 1 2 Avanti



Esegui il login per scrivere una risposta.