[Python] delimitatori testo in sqlite
Buongiorno, forse e' una sciocchezza ma faccio lo stesso questa domanda: sto cercando di implementare un semplice database con Sqlite, e sto facendo alcune prove a mano direttamente con Sqlite stesso. Il database di prova contiene una tabella del genere: pippo (a integer primary key autoincrement, b text, c text); Cerco di inserire del testo a caso da qualche testo ma, se nella copia sono presenti doppi apici o singoli apici Sqlite mi comunica che non è correttamente identato. Secondo voi dovrei implementare un controllo dell'identazione degli apici prima dell'inserimento, con una funzione Python, oppure esiste una funzione che automaticamente risolve questo problema durante l'input? a presto, massimo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] delimitatori testo in sqlite
Adoro sqlite soprattutto perchè ti permette di fare lavori semplici in modo molto veloce! Ad ogni modo... Puoi fornirci il codice che utilizzi? Personalmente non ho trovato questo problema nell'inserimento di dati. Ti riporto parte di mio codice per leggere un CSV e riportarlo su un db sqlite: magari può esserti utile. Occhio: magari devi fare un decode come ti segnalo nel codice csv_reader = csv.reader(filecsv, delimiter=';', quotechar = '') campi=string.split(cnf['tabelle'][i],\n) for j in range(len(campi)): campo = re.search('(.+).+', campi[j]) if campo: campi[j]=campo.group(1) campi.pop(0) # Elimina il nome della tabella dai campi campi.pop(-1) # Elimina la parentesi finale dai campi print Riempio la tabella %s % i k=0 p=1 inserisci=INSERT INTO %s VALUES( % i for row in csv_reader: l=len(row) for m in range(l): row[m] = row[m].decode('latin1') if k == 0:# Controlla che i campi della tabella siano uguali a quelli del CSV!!! for c in range(len(row)): if row[c] == campi[c]: inserisci = %s %s % (inserisci,?, ) else: print DEVI CAMBIARE LA DEFINIZIONE IN CONFIGURAZIONE DI CREAZIONE TABELLA %s % row[c] else: dimensione=len(inserisci)-2 inserisci = inserisci[0:dimensione] # Inserendo ?, cancello l'ultima occorrenza di , inserisci = %s %s % (inserisci, )) cur.execute(inserisci,row) if k==300: print Ho finito di aggiungere %d record % (k*p) p=p+1 k=1 k=k+1 con.commit() Il giorno 05 novembre 2010 09:33, Massimo Capanni massimo.capa...@gmail.com ha scritto: Buongiorno, forse e' una sciocchezza ma faccio lo stesso questa domanda: sto cercando di implementare un semplice database con Sqlite, e sto facendo alcune prove a mano direttamente con Sqlite stesso. Il database di prova contiene una tabella del genere: pippo (a integer primary key autoincrement, b text, c text); Cerco di inserire del testo a caso da qualche testo ma, se nella copia sono presenti doppi apici o singoli apici Sqlite mi comunica che non è correttamente identato. Secondo voi dovrei implementare un controllo dell'identazione degli apici prima dell'inserimento, con una funzione Python, oppure esiste una funzione che automaticamente risolve questo problema durante l'input? a presto, massimo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] delimitatori testo in sqlite
non ho ancora scritto il codice python, proprio perche' prima mi ponevo questo problema scrivendo a mano le query direttamente su Sqlite, ma evidentemente stavo sbagliando approccio :-) grazie del suggerimento. Il giorno 05 novembre 2010 09:44, Vittorio Zuccala' vittorio.zucc...@gmail.com ha scritto: Adoro sqlite soprattutto perchè ti permette di fare lavori semplici in modo molto veloce! Ad ogni modo... Puoi fornirci il codice che utilizzi? Personalmente non ho trovato questo problema nell'inserimento di dati. Ti riporto parte di mio codice per leggere un CSV e riportarlo su un db sqlite: magari può esserti utile. Occhio: magari devi fare un decode come ti segnalo nel codice csv_reader = csv.reader(filecsv, delimiter=';', quotechar = '') campi=string.split(cnf['tabelle'][i],\n) for j in range(len(campi)): campo = re.search('(.+).+', campi[j]) if campo: campi[j]=campo.group(1) campi.pop(0) # Elimina il nome della tabella dai campi campi.pop(-1) # Elimina la parentesi finale dai campi print Riempio la tabella %s % i k=0 p=1 inserisci=INSERT INTO %s VALUES( % i for row in csv_reader: l=len(row) for m in range(l): row[m] = row[m].decode('latin1') if k == 0:# Controlla che i campi della tabella siano uguali a quelli del CSV!!! for c in range(len(row)): if row[c] == campi[c]: inserisci = %s %s % (inserisci,?, ) else: print DEVI CAMBIARE LA DEFINIZIONE IN CONFIGURAZIONE DI CREAZIONE TABELLA %s % row[c] else: dimensione=len(inserisci)-2 inserisci = inserisci[0:dimensione] # Inserendo ?, cancello l'ultima occorrenza di , inserisci = %s %s % (inserisci, )) cur.execute(inserisci,row) if k==300: print Ho finito di aggiungere %d record % (k*p) p=p+1 k=1 k=k+1 con.commit() Il giorno 05 novembre 2010 09:33, Massimo Capanni massimo.capa...@gmail.com ha scritto: Buongiorno, forse e' una sciocchezza ma faccio lo stesso questa domanda: sto cercando di implementare un semplice database con Sqlite, e sto facendo alcune prove a mano direttamente con Sqlite stesso. Il database di prova contiene una tabella del genere: pippo (a integer primary key autoincrement, b text, c text); Cerco di inserire del testo a caso da qualche testo ma, se nella copia sono presenti doppi apici o singoli apici Sqlite mi comunica che non è correttamente identato. Secondo voi dovrei implementare un controllo dell'identazione degli apici prima dell'inserimento, con una funzione Python, oppure esiste una funzione che automaticamente risolve questo problema durante l'input? a presto, massimo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] delimitatori testo in sqlite
Ok, allora facci vedere delle query che hai scritto. Anche a questo proposito ti giro una delle viste che creo per un lavoro: se devi fare qualcosa di dinamico ti conosiglio vivamente le viste. Rimangono nel db sqlite anche quando il programma python termina e da python basta fare un SELECT * FROM VISTA Spero anche questo ti possa essere utile: CREATE VIEW AnticipiCorretta AS select QPR_AGENTE As AgenteCodice, AC_RAG_SOCIALE_1 As AgenteRagioneSociale, QPR_NUM_PRATICA Pratica, CQREP_00_STATO As Stato, CQREP_00_ATTRIBUTO As Attributo, julianday(date('now'))-julianday(strftime(%Y-%m-%d,substr(QPRAN_DATA,1,4) || - || substr(QPRAN_DATA,5,2) || - || substr(QPRAN_DATA,7,2))) As Giorni, NETTO As Netto, QPR_PRODOTTO As Prodotto, prodotti.Descrizione As ProdottoDescrizione, C/D As C/D, P/P/P As P/P/P, QPRAN_PROGRESSIVO As Progressivo, ANTICIPO As Anticipo, QPRAN_MODALITA As Modalita, QPRAN_DATA_STORNO As DataStorno, QPRAN_PROVENIENZA As Provenienza, QPRAN_DESTINATARIO As Destinatario, strftime(%Y-%m-%d,substr(QPRAN_DATA,1,4) || - || substr(QPRAN_DATA,5,2) || - || substr(QPRAN_DATA,7,2)) As DataErogazione from anticipi LEFT JOIN prodotti ON anticipi.QPR_Prodotto=prodotti.IDCodice INNER JOIN cqrep000f ON anticipi.QPR_NUM_Pratica=cqrep000f.CQREP_00_Pratica WHERE Stato = 30 and Attributo NOT LIKE 'RT' and DataStorno = 0 ORDER BY AgenteCodice ASC, Giorni DESC Il giorno 05 novembre 2010 09:57, Massimo Capanni massimo.capa...@gmail.com ha scritto: non ho ancora scritto il codice python, proprio perche' prima mi ponevo questo problema scrivendo a mano le query direttamente su Sqlite, ma evidentemente stavo sbagliando approccio :-) grazie del suggerimento. Il giorno 05 novembre 2010 09:44, Vittorio Zuccala' vittorio.zucc...@gmail.com ha scritto: Adoro sqlite soprattutto perchè ti permette di fare lavori semplici in modo molto veloce! Ad ogni modo... Puoi fornirci il codice che utilizzi? Personalmente non ho trovato questo problema nell'inserimento di dati. Ti riporto parte di mio codice per leggere un CSV e riportarlo su un db sqlite: magari può esserti utile. Occhio: magari devi fare un decode come ti segnalo nel codice csv_reader = csv.reader(filecsv, delimiter=';', quotechar = '') campi=string.split(cnf['tabelle'][i],\n) for j in range(len(campi)): campo = re.search('(.+).+', campi[j]) if campo: campi[j]=campo.group(1) campi.pop(0) # Elimina il nome della tabella dai campi campi.pop(-1) # Elimina la parentesi finale dai campi print Riempio la tabella %s % i k=0 p=1 inserisci=INSERT INTO %s VALUES( % i for row in csv_reader: l=len(row) for m in range(l): row[m] = row[m].decode('latin1') if k == 0:# Controlla che i campi della tabella siano uguali a quelli del CSV!!! for c in range(len(row)): if row[c] == campi[c]: inserisci = %s %s % (inserisci,?, ) else: print DEVI CAMBIARE LA DEFINIZIONE IN CONFIGURAZIONE DI CREAZIONE TABELLA %s % row[c] else: dimensione=len(inserisci)-2 inserisci = inserisci[0:dimensione] # Inserendo ?, cancello l'ultima occorrenza di , inserisci = %s %s % (inserisci, )) cur.execute(inserisci,row) if k==300: print Ho finito di aggiungere %d record % (k*p) p=p+1 k=1 k=k+1 con.commit() Il giorno 05 novembre 2010 09:33, Massimo Capanni massimo.capa...@gmail.com ha scritto: Buongiorno, forse e' una sciocchezza ma faccio lo stesso questa domanda: sto cercando di implementare un semplice database con Sqlite, e sto facendo alcune prove a mano direttamente con Sqlite stesso. Il database di prova contiene una tabella del genere: pippo (a integer primary key autoincrement, b text, c text); Cerco di inserire del testo a caso da qualche testo ma, se nella copia sono presenti doppi apici o singoli apici Sqlite mi comunica che non è correttamente identato. Secondo voi dovrei implementare un controllo dell'identazione degli apici prima dell'inserimento, con una funzione Python, oppure esiste una funzione che automaticamente risolve questo problema durante l'input? a presto, massimo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python ___ Python mailing list
Re: [Python] delimitatori testo in sqlite
On Fri, 5 Nov 2010 09:33:08 +0100, Massimo Capanni massimo.capa...@gmail.com wrote: forse e' una sciocchezza ma faccio lo stesso questa domanda: sto cercando di implementare un semplice database con Sqlite, e sto facendo alcune prove a mano direttamente con Sqlite stesso. Il database di prova contiene una tabella del genere: pippo (a integer primary key autoincrement, b text, c text); Cerco di inserire del testo a caso da qualche testo ma, se nella copia sono presenti doppi apici o singoli apici Sqlite mi comunica che non è correttamente identato. Secondo voi dovrei implementare un controllo dell'identazione degli apici prima dell'inserimento, con una funzione Python, oppure esiste una funzione che automaticamente risolve questo problema durante l'input? Certo che esiste! E se provi a quotare a mano le stringhe, arriva la fatina dell'SQL... e ti spezza le ditina! :) cursor.execute() prende due argomenti: la stringa sql con dei segnaposto (in sqlite sono dei ?) e una sequenza di variabili: *ci pensa lui* a metterle insieme e a gestirsi gli apici. cur.execute(SELECT ?, ?;, (42, l'apostrofo)).fetchone() (42, ul'apostrofo) Letture fondamentali prima di fare qualunque cosa con i database in python: * la DB-API, comune a tutti i moduli database python di qualche rilevanza http://www.python.org/dev/peps/pep-0249/ * http://en.wikipedia.org/wiki/SQL_injection * http://xkcd.com/327/ Nella doc di psycopg ci sono più dettagli su perché la fatina dell'SQL si arrabbia (ti ho già detto che è pelosa?): http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries. Fai le dovute differenze perché psycopg usa %s invece di ? come segnaposto. A presto! -- Daniele Varrazzo - Develer S.r.l. http://www.develer.com ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] delimitatori testo in sqlite
*imbarazzato* ... :-) grazie di tutti i suggerimenti, li provero' subito! per la cronaca questo erano le istruzioni 'a manina' che effettuavo: ++ .header ON .mode column create table pippo (a integer primary key autoincrement, b text, c text); insert into pippo (b, c) values ('12/10/2010', 'Le esperienze dell'infanzia e della prima adolescenza, insieme ai giochi che intrattenava con gli amici, saranno al centro di una successiva opera, il Dottor Sax: la figura del Dottor Sax fu modellata da Kerouac su quella dell'Ombra, protagonista di un programma radiofonico settimanale. Nel 1939 si diploma alla Lowell High School e in questo anno intreccia una relazione amorosa, che non oltrepassa i confini di una casta infatuazione, con Mary Carney: questa relazione amorosa verrà rievocata in Maggie Cassidy.'); select * from pippo; .exit ++ a presto, max Il giorno 05 novembre 2010 12:21, Daniele Varrazzo p...@develer.com ha scritto: On Fri, 5 Nov 2010 09:33:08 +0100, Massimo Capanni massimo.capa...@gmail.com wrote: forse e' una sciocchezza ma faccio lo stesso questa domanda: sto cercando di implementare un semplice database con Sqlite, e sto facendo alcune prove a mano direttamente con Sqlite stesso. Il database di prova contiene una tabella del genere: pippo (a integer primary key autoincrement, b text, c text); Cerco di inserire del testo a caso da qualche testo ma, se nella copia sono presenti doppi apici o singoli apici Sqlite mi comunica che non è correttamente identato. Secondo voi dovrei implementare un controllo dell'identazione degli apici prima dell'inserimento, con una funzione Python, oppure esiste una funzione che automaticamente risolve questo problema durante l'input? Certo che esiste! E se provi a quotare a mano le stringhe, arriva la fatina dell'SQL... e ti spezza le ditina! :) cursor.execute() prende due argomenti: la stringa sql con dei segnaposto (in sqlite sono dei ?) e una sequenza di variabili: *ci pensa lui* a metterle insieme e a gestirsi gli apici. cur.execute(SELECT ?, ?;, (42, l'apostrofo)).fetchone() (42, ul'apostrofo) Letture fondamentali prima di fare qualunque cosa con i database in python: * la DB-API, comune a tutti i moduli database python di qualche rilevanza http://www.python.org/dev/peps/pep-0249/ * http://en.wikipedia.org/wiki/SQL_injection * http://xkcd.com/327/ Nella doc di psycopg ci sono più dettagli su perché la fatina dell'SQL si arrabbia (ti ho già detto che è pelosa?): http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries . Fai le dovute differenze perché psycopg usa %s invece di ? come segnaposto. A presto! -- Daniele Varrazzo - Develer S.r.l. http://www.develer.com ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] delimitatori testo in sqlite
Ciao Massimo, come ti dicevo ecco che postando il codice, debuggare diventa più semplice :-) Le istruzioni sono corrette. Il problema sta nel fatto che se metti gli apici singoli per risolvere il fatto che Dottor Sax e altri hanno i doppi apici... non devi mettere altri singoli apici, sebbene nella nostra lingua possa essere apostrofi dentro la frase. Ok è una frase lunghissima dove non si capisce una fava ma quello che voglio dire è che se: - dell'infanzia diventa della infanzia - dell'Ombra diventa della Ombra Allora tutto va a posto. Prova con questo insert: insert into pippo (b, c) values ('12/10/2010', 'Le esperienze della infanzia e della prima adolescenza, insieme ai giochi che intrattenava con gli amici, saranno al centro di una successiva opera, il Dottor Sax: la figura del Dottor Sax fu modellata da Kerouac su quella della Ombra, protagonista di un programma radiofonico settimanale. Nel 1939 si diploma alla Lowell High School e in questo anno intreccia una relazione amorosa, che non oltrepassa i confini di una casta infatuazione, con Mary Carney: questa relazione amorosa verrà rievocata in Maggie Cassidy.'); Il giorno 05 novembre 2010 14:20, Massimo Capanni massimo.capa...@gmail.com ha scritto: *imbarazzato* ... :-) grazie di tutti i suggerimenti, li provero' subito! per la cronaca questo erano le istruzioni 'a manina' che effettuavo: ++ .header ON .mode column create table pippo (a integer primary key autoincrement, b text, c text); insert into pippo (b, c) values ('12/10/2010', 'Le esperienze dell'infanzia e della prima adolescenza, insieme ai giochi che intrattenava con gli amici, saranno al centro di una successiva opera, il Dottor Sax: la figura del Dottor Sax fu modellata da Kerouac su quella dell'Ombra, protagonista di un programma radiofonico settimanale. Nel 1939 si diploma alla Lowell High School e in questo anno intreccia una relazione amorosa, che non oltrepassa i confini di una casta infatuazione, con Mary Carney: questa relazione amorosa verrà rievocata in Maggie Cassidy.'); select * from pippo; .exit ++ a presto, max Il giorno 05 novembre 2010 12:21, Daniele Varrazzo p...@develer.com ha scritto: On Fri, 5 Nov 2010 09:33:08 +0100, Massimo Capanni massimo.capa...@gmail.com wrote: forse e' una sciocchezza ma faccio lo stesso questa domanda: sto cercando di implementare un semplice database con Sqlite, e sto facendo alcune prove a mano direttamente con Sqlite stesso. Il database di prova contiene una tabella del genere: pippo (a integer primary key autoincrement, b text, c text); Cerco di inserire del testo a caso da qualche testo ma, se nella copia sono presenti doppi apici o singoli apici Sqlite mi comunica che non è correttamente identato. Secondo voi dovrei implementare un controllo dell'identazione degli apici prima dell'inserimento, con una funzione Python, oppure esiste una funzione che automaticamente risolve questo problema durante l'input? Certo che esiste! E se provi a quotare a mano le stringhe, arriva la fatina dell'SQL... e ti spezza le ditina! :) cursor.execute() prende due argomenti: la stringa sql con dei segnaposto (in sqlite sono dei ?) e una sequenza di variabili: *ci pensa lui* a metterle insieme e a gestirsi gli apici. cur.execute(SELECT ?, ?;, (42, l'apostrofo)).fetchone() (42, ul'apostrofo) Letture fondamentali prima di fare qualunque cosa con i database in python: * la DB-API, comune a tutti i moduli database python di qualche rilevanza http://www.python.org/dev/peps/pep-0249/ * http://en.wikipedia.org/wiki/SQL_injection * http://xkcd.com/327/ Nella doc di psycopg ci sono più dettagli su perché la fatina dell'SQL si arrabbia (ti ho già detto che è pelosa?): http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries . Fai le dovute differenze perché psycopg usa %s invece di ? come segnaposto. A presto! -- Daniele Varrazzo - Develer S.r.l. http://www.develer.com ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] delimitatori testo in sqlite
On Fri, 5 Nov 2010 14:36:59 +0100, Vittorio Zuccala' vittorio.zucc...@gmail.com wrote: Le istruzioni sono corrette. Il problema sta nel fatto che se metti gli apici singoli per risolvere il fatto che Dottor Sax e altri hanno i doppi apici... non devi mettere altri singoli apici, sebbene nella nostra lingua possa essere apostrofi dentro la frase. Stai scherzando, vero? Vorresti dire che in un database non si possono mettere apostrofi? No, le istruzioni postate *non* sono corrette: l'espressione sql insert [...] values ('l'apostrofo') è un errore di sintassi sql e la correzione non è insert ('lo apostrofo'): questa è una trasformazione semantica e immette dati diversi da quelli desiderati. La sintassi accettata da molti database è quella di raddoppiare gli apostrofi (altri meccanismi per altri database): insert [...] values ('l''apostrofo') è sia corretto come sintassi sql sia fa quello che deve fare. In ottica di Python poi, visto che quest'ultimo ha un modo diverso di ricevere in input una costante stringa ('l\'apostrofo' o l'apostrofo...) occorre una trasformazione (ma sintattica, non semantica) che converta un oggetto stringa python in una rappresentazione stringa sql, e il driver è l'unico oggetto che si deve occupare di questa trasformazione. -- Daniele Varrazzo - Develer S.r.l. http://www.develer.com ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] delimitatori testo in sqlite
Il giorno 05 novembre 2010 15:12, Daniele Varrazzo p...@develer.com ha scritto: Stai scherzando, vero? Vorresti dire che in un database non si possono mettere apostrofi? Daniele, scherzare è uno dei punti di forza del mio carattere ma in questo contesto di solito non sono solito farlo. No, le istruzioni postate *non* sono corrette: l'espressione sql insert [...] values ('l'apostrofo') è un errore di sintassi sql e la correzione non è insert ('lo apostrofo'): questa è una trasformazione semantica e immette dati diversi da quelli desiderati. La sintassi accettata da molti database è quella di raddoppiare gli apostrofi (altri meccanismi per altri database): insert [...] values ('l''apostrofo') è sia corretto come sintassi sql sia fa quello che deve fare. Ti ringrazio per la precisazione sicuramente più tecnica. Lo scopo del mio post non era quello di dire che non si devono usare apostrofi ma che il problema era l'apostrofo. L'escape nell'apostrofo è una cosa sicuramente buona e giusta. Grazie quindi per le precisazioni. Sicuramente Massimo e la comunità ne gioverà. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python