Topic: Problema con le liste e SQL  (Letto 1081 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline 10plan

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 1
    • Mostra profilo
Problema con le liste e SQL
« il: Aprile 21, 2011, 22:43 »
Nome Topic: Problema con le liste e SQL
Sezione: Base

Salve a tutti.
Ho letto un tutorial di Python (Pensare da Informatico) http://www.python.it/doc/Howtothink/Howtothink-html-it/index.htm
ed anche il libro Python della serie pocket APOGEO (http://www.apogeonline.com/libri/88-503-2599-1/scheda).

Ho scritto un programmino molto semplice, per capire come funzionano le liste e Sqlite3, ma ho un problema che non mi spiego:

Il codice di base è questo:

[codice]
tRes = string.replace(str(tRes),"[","")         # Elimino le quadre
tRes = string.replace(str(tRes),"]","")         # Elimino le quadre
[r0,r1,r2,r3,r4,r5,r6,r7,r8,r9] = string.split(str(tRes),",")  # Separo i singoli valori della lista mettendoli nelle relative variabili

# preparo il codice sql da passare alla funzione che farà la insert
Sql = """insert into dl values('" + r0 + "','" + r1 + "','" + r2 + "','" + r3 + "','" + r4 + "','" + r5 + "','" + r6 + "','" + r7 + "','" + r8 + "','" + r9 + "')"""
InsertIntoDB('X_db','X_table',Sql)               # Inserisco i valori nel DB
[/codice]

Funziona tutto correttamente però continuo a non capire perchè ottengo la stringa SQL in questo modo:

[codice]
'insert into dl values(\'" + r0 + "\',\'" + r1 + "\',\'" + r2 + "\',\'" + r3 + "\',\'" + r4 + "\',\'" + r5 + "\',\'" + r6 + "\',\'" + r7 + "\',\'" + r8 + "\',\'" + r9 + "\')'
[/codice]

In realtà i backslash sono doppi, ho provato a riscrivere il codice in altro modo ma il risultato non cambia.
Qualcuno può aiutare?  Grazie

Offline Markon

  • python sapiens sapiens
  • *
  • moderatore
  • Post: 4.104
  • Punti reputazione: 5
    • Mostra profilo
    • Neolithic
Re: Problema con le liste e SQL
« Risposta #1 il: Aprile 21, 2011, 23:00 »
Fossero tutti gli utenti come te.
Hai la mia più profonda ammirazione!  :D

Passiamo ora al tuo problema.
Trascurando il fatto che è buona norma in Python seguire una convenzione, descritta nella PEP8, il tuo problema sta nel fatto che stai usando stringhe multiriga al cui interno ci sono stringhe.
Il punto è che la stringa "esterna" è quella multiriga, che "sovrascrive" il suo interno: ha più "forza" di quelle interne, per cui Python non andrà a interpretare il contenuto di r0, r1, .. perchè le considererà parte della stringa "esterna".

Soluzioni:
 - usi i vari %s, %d, eccetera
[codice]sql = """insert into dl values(%s, %d, %s, ...,%s)""" % (r0, r1, r2, ...)[/codice]
 - spezzetti la stringa in questo modo:

[codice]sql = "insert into dl values('", r0, "', '....)"[/codice]
che non è consigliato.

Offline 10plan

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 1
    • Mostra profilo
Re: Problema con le liste e SQL
« Risposta #2 il: Aprile 21, 2011, 23:06 »
Fossero tutti gli utenti come te.
Hai la mia più profonda ammirazione!  :D

Passiamo ora al tuo problema.
Trascurando il fatto che è buona norma in Python seguire una convenzione, descritta nella PEP8, il tuo problema sta nel fatto che stai usando stringhe multiriga al cui interno ci sono stringhe.
Il punto è che la stringa "esterna" è quella multiriga, che "sovrascrive" il suo interno: ha più "forza" di quelle interne, per cui Python non andrà a interpretare il contenuto di r0, r1, .. perchè le considererà parte della stringa "esterna".

Soluzioni:
 - usi i vari %s, %d, eccetera
[codice]sql = """insert into dl values(%s, %d, %s, ...,%s)""" % (r0, r1, r2, ...)[/codice]
 - spezzetti la stringa in questo modo:

[codice]sql = "insert into dl values('", r0, "', '....)"[/codice]
che non è consigliato.

Ciao Markon, grazie per le lusinghe ed il consiglio..
Ma se la soluzione da te proposta non è consigliata, allora quale è il metodo corretto?

Altra domanda, quando parli di convenzione a cosa ti riferisci?

Offline Markon

  • python sapiens sapiens
  • *
  • moderatore
  • Post: 4.104
  • Punti reputazione: 5
    • Mostra profilo
    • Neolithic
Re: Problema con le liste e SQL
« Risposta #3 il: Aprile 21, 2011, 23:12 »
Fossero tutti gli utenti come te.
Hai la mia più profonda ammirazione!  :D

Passiamo ora al tuo problema.
Trascurando il fatto che è buona norma in Python seguire una convenzione, descritta nella PEP8, il tuo problema sta nel fatto che stai usando stringhe multiriga al cui interno ci sono stringhe.
Il punto è che la stringa "esterna" è quella multiriga, che "sovrascrive" il suo interno: ha più "forza" di quelle interne, per cui Python non andrà a interpretare il contenuto di r0, r1, .. perchè le considererà parte della stringa "esterna".

Soluzioni:
 - usi i vari %s, %d, eccetera
[codice]sql = """insert into dl values(%s, %d, %s, ...,%s)""" % (r0, r1, r2, ...)[/codice]
 - spezzetti la stringa in questo modo:

[codice]sql = "insert into dl values('", r0, "', '....)"[/codice]
che non è consigliato.

Ciao Markon, grazie per le lusinghe ed il consiglio..
Ma se la soluzione da te proposta non è consigliata, allora quale è il metodo corretto?

Altra domanda, quando parli di convenzione a cosa ti riferisci?



1) Il primo metodo è quello consigliato! Per "sconsigliato" mi riferivo al secondo elencato. Insomma, ci sono varie soluzioni. Usa la prima, ma sappi che puoi usare la seconda ;)

2) In pratica sono delle "norme" di buona scrittura di codice che è meglio che le impari subito. Nel tuo caso:
tRes diventa t_res (scegli un nome decente, non si capisce cosa sia t_res), Sql diventa sql, InsertIntoDb diventa insert_into_db.

Offline 10plan

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 1
    • Mostra profilo
Re: Problema con le liste e SQL
« Risposta #4 il: Aprile 21, 2011, 23:18 »
Grazie mille, sei stato chiarissimo  ;)

Domani provo la tua soluzione ed adeguo il codice alle convenzioni   :ok:

Vi tengo informati sugli sviluppi

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.083
  • Punti reputazione: 9
    • Mostra profilo
Re: Problema con le liste e SQL
« Risposta #5 il: Aprile 22, 2011, 10:49 »
Citazione
Il primo metodo è quello consigliato!
Mi raccomando, no. Mai costruire una query in questo modo, è molto pericoloso... anzi, lo dico con le parole della documentazione del modulo sqlite3, che dovresti leggerti bene...
Citazione
You shouldn’t assemble your query using Python’s string operations because doing so is insecure; it makes your program vulnerable to an SQL injection attack. Instead, use the DB-API’s parameter substitution. Put ? as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor’s execute() method.
Certo, al limite potresti assemblare le query con gli %s quando sei stra-sicuro dei dati che inserisci, ma ti stra-consiglio di abituarti comunque al modo giusto, anche perché è semplice e veloce.
[codice]
# i dati di partenza dovrebbero essere organizzati in tuple o in liste.
# Se non e' cosi'... elabora i dati di partenza!
dati = (('Paolo', 'Rossi', 'via Garibaldi 5'), ('Giuseppe', 'Verdi', 'via Roma 10'),
           ('Mario', 'Bianchi', 'via Milano 12'))
# ecco la stringa sql giusta... nota i placeholders "?"
sql = 'INSERT INTO tabella VALUES (?, ?, ?);'
# e adesso inserisco i dati
for dato in dati:
    cursor.execute(sql, dato)
[/codice]
Comunque, ripeto, leggiti la documentazione di sqlite3, è piena di esempi corretti...
ciao
rp

Offline 10plan

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 1
    • Mostra profilo
Re: Problema con le liste e SQL
« Risposta #6 il: Aprile 22, 2011, 11:03 »
Citazione
Il primo metodo è quello consigliato!
Mi raccomando, no. Mai costruire una query in questo modo, è molto pericoloso... anzi, lo dico con le parole della documentazione del modulo sqlite3, che dovresti leggerti bene...
Citazione
You shouldn’t assemble your query using Python’s string operations because doing so is insecure; it makes your program vulnerable to an SQL injection attack. Instead, use the DB-API’s parameter substitution. Put ? as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor’s execute() method.
Certo, al limite potresti assemblare le query con gli %s quando sei stra-sicuro dei dati che inserisci, ma ti stra-consiglio di abituarti comunque al modo giusto, anche perché è semplice e veloce.
[codice]
# i dati di partenza dovrebbero essere organizzati in tuple o in liste.
# Se non e' cosi'... elabora i dati di partenza!
dati = (('Paolo', 'Rossi', 'via Garibaldi 5'), ('Giuseppe', 'Verdi', 'via Roma 10'),
           ('Mario', 'Bianchi', 'via Milano 12'))
# ecco la stringa sql giusta... nota i placeholders "?"
sql = 'INSERT INTO tabella VALUES (?, ?, ?);'
# e adesso inserisco i dati
for dato in dati:
    cursor.execute(sql, dato)
[/codice]
Comunque, ripeto, leggiti la documentazione di sqlite3, è piena di esempi corretti...
ciao
rp

Grande RicPol,
 grazie mille per l'ennesimo consiglio e per la messa in guardia sul problema del Sql-injection!

Provvederò a sistemare il mio codice a dovere.   ;)

Offline Markon

  • python sapiens sapiens
  • *
  • moderatore
  • Post: 4.104
  • Punti reputazione: 5
    • Mostra profilo
    • Neolithic
Re: Problema con le liste e SQL
« Risposta #7 il: Aprile 22, 2011, 11:04 »
Citazione
Il primo metodo è quello consigliato!
Mi raccomando, no. Mai costruire una query in questo modo, è molto pericoloso... anzi, lo dico con le parole della documentazione del modulo sqlite3, che dovresti leggerti bene...

Hai ragione! Mi riferivo alla costruzione di stringhe, non di una query, quindi distrattamente gli ho suggerito un metodo potenzialmente pericoloso.  :ok:

Offline 10plan

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 1
    • Mostra profilo
Re: Problema con le liste e SQL
« Risposta #8 il: Aprile 24, 2011, 11:14 »
Ciao Ragazzi, funziona alla grande..
SQLite3 è davvero facile da utilizzare, anzi segnalo per chi non avesse voglia di fare tutto via riga di comando ed istruzioni sql, che esistono moltissime gui per sqlite.

Sul Mac io sto usando SQLiteStudio, e devo dire che velocizza di molto la creazione, la modifica e l'interrogazione delle tabelle!!
 :ok:

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2.045
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of your Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of your Python code
Re: Problema con le liste e SQL
« Risposta #9 il: Aprile 24, 2011, 19:24 »
Non usare il modulo string... È deprecato da 10 anni...

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re: Problema con le liste e SQL
« Risposta #10 il: Aprile 24, 2011, 23:30 »
Sul Mac io sto usando SQLiteStudio, e devo dire che velocizza di molto la creazione, la modifica e l'interrogazione delle tabelle!!

Ho seri dubbi in proposito.

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.083
  • Punti reputazione: 9
    • Mostra profilo
Re: Problema con le liste e SQL
« Risposta #11 il: Aprile 26, 2011, 09:45 »
Citazione
Citazione di: 10plan - Aprile 24, 2011, 11:14
Sul Mac io sto usando SQLiteStudio, e devo dire che velocizza di molto la creazione, la modifica e l'interrogazione delle tabelle!!

Ho seri dubbi in proposito.
E perché no? E' uno strumento valido per chi comincia. Ti evita di spaccarti la testa su tutti gli errori banali che faresti a scrivere-testare-riscrivere sql a mano, quando non sei ancora abituato. L'importante è che uno poi deve passare oltre, appena ha imparato a padroneggiare i concetti di base.
rp

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re: Problema con le liste e SQL
« Risposta #12 il: Aprile 26, 2011, 15:03 »
E perché no? E' uno strumento valido per chi comincia. Ti evita di spaccarti la testa su tutti gli errori banali che faresti a scrivere-testare-riscrivere sql a mano, quando non sei ancora abituato. L'importante è che uno poi deve passare oltre, appena ha imparato a padroneggiare i concetti di base.

1. dubito che si faccia prima con una gui a scrivere quello che e', a tutti gli effetti, del codice. tutte le volte che mi ci sono trovato ho cercato un qualche campo dove potessi scrivere direttamente dopo una manciata di minuti di frustrazione.

2. trovo che *didatticamente* gli strumenti cosidetti facilitati siano molto rischiosi. Si fa prima ad imparare per bene le cose, poi, semmai se un tool velocizza il lavoro (cosa non scontata) lo si usa.