Problemi frequenti con SQL e Python e come risolverli

Ultimo aggiornamento: 04/16/2026
  • La combinazione di SQL e Python consente di realizzare potenti flussi di lavoro end-to-end per la gestione dei dati, ma espone a problematiche relative a connessioni, dipendenze e versioni.
  • SQL Server Machine Learning Services integra R/Python nel motore, con numerose avvertenze relative all'installazione, all'esecuzione e ai tipi di dati.
  • Gli schemi normalizzati con chiavi primarie e esterne, oltre alle JOIN, sono essenziali quando si modellano relazioni reali in SQLite o in altri RDBMS.
  • Un'attenta configurazione dei driver, la gestione dei tipi e la governance delle risorse sono fondamentali per integrazioni SQL-Python affidabili e ad alte prestazioni.

Risoluzione dei problemi di SQL e Python

Lavorare con SQL e Python insieme è una delle combinazioni più potenti nello sviluppo di dati e backend.ma apre anche la porta a una lunga lista di errori subdoli, trappole di configurazione e sorprese in termini di prestazioni. Se vi è mai capitato di fissare un traceback criptico mentre la vostra connessione al database "dovrebbe funzionare senza problemi", o di chiedervi perché lo stesso script analitico venga eseguito alla velocità della luce sul vostro portatile ma sia lentissimo all'interno di SQL Server, non siete soli.

Questa guida riunisce problemi reali di SQL-Python, problematiche di basso livello relative a SQL Server Machine Learning Services e modelli pratici per l'utilizzo di entrambi i linguaggi nell'analisi dei dati.Invece di consigli vaghi, troverai esempi concreti, messaggi di errore tipici e idee passo passo per diagnosticare e risolvere i problemi, oltre a una panoramica completa su come progettare, interrogare e manipolare database in Python utilizzando SQLite e altri motori.

Problemi di connessione comuni tra SQL e Python

Uno dei primi problemi quando si combinano SQL e Python è semplicemente ottenere una connessione stabile.Anche quando le credenziali e i DSN sembrano corretti, piccole discrepanze nei driver, nei percorsi o negli ambienti possono generare errori di runtime fuorvianti nel momento in cui si avvia app.py o si esegue uno script dalla riga di comando.

Negli ambienti virtualizzati questo diventa più fragileAd esempio, potresti eseguire SQLite o SQL Server all'interno di una macchina virtuale mentre sviluppi sul sistema operativo host e testi la connessione con uno strumento GUI come SQL Developer o SQL Server Management Studio. L'interfaccia grafica si connette correttamente, ma lo script Python fallisce perché utilizza un driver diverso, una libreria mancante o un percorso di rete completamente diverso.

I problemi di connessione tipici includono driver API ODBC/DB mancanti, configurazione DSN errata, porte bloccate e modalità di autenticazione non corrispondenti.È molto comune che Python generi eccezioni generiche come "impossibile connettersi", mentre il problema di fondo è che il sistema non riesce a caricare una libreria condivisa (ad esempio, libc++ o libc++abi su Linux) o non trova il driver ODBC previsto per SQLite, PostgreSQL, MySQL o SQL Server.

Quando ci si connette da Python, in genere si utilizzano librerie come sqlite3, psycopg2, pyodbc, mysql-connector-python, PyMySQL o un livello ORM come SQLAlchemy.Ognuno di essi ha il proprio formato di stringa di connessione, tipi di errore e dipendenze. Un client GUI potrebbe utilizzare uno stack di driver diverso che nasconde questi problemi, quindi è sempre necessario verificare quale driver e quali parametri di connessione vengono utilizzati esattamente dal codice Python.

Perché combinare SQL e Python è strategicamente vantaggioso

Al di là dei problemi tecnici, esiste una ragione strategica per cui sviluppatori e analisti continuano a insistere sulla combinazione di Python con SQL.Ogni linguaggio copre una parte diversa del ciclo di vita dei dati e, insieme, offrono un flusso di lavoro completo difficilmente replicabile con un singolo strumento.

SQL rimane lo standard per la gestione dei dati relazionali.Eccelle nella gestione di dati ben strutturati, integrità relazionale, indicizzazione e carichi di lavoro transazionali. Con SQL si ottengono filtraggio, join e aggregazione rapidi su grandi set di dati, accesso unificato per numerosi strumenti e prestazioni prevedibili, frutto di decenni di ricerca sui database.

Python dà il meglio di sé quando i dati escono dal contesto del database.Con librerie come pandas, NumPy, matplotlib e seaborn è possibile pulire, rimodellare e analizzare i dati in modi arbitrariamente complessi, eseguire statistiche o apprendimento automatico e creare visualizzazioni o report in modo programmatico, inclusi analisi dei dati in tempo realeMolte trasformazioni che risultano complesse o prolisse in SQL diventano semplici espressioni Python.

In pratica ciò significa una chiara divisione del lavoro: delegare il più possibile le operazioni di filtraggio, aggregazione e trasformazione di base a SQL, per poi riportare un dataset ordinato in Python per analisi approfondite, modellazione o visualizzazione. Analisti e ingegneri che padroneggiano entrambi i linguaggi possono passare rapidamente da una domanda aziendale a una pipeline di dati riproducibile.

Connessione di Python a database SQL: librerie e modelli

Per far funzionare SQL e Python insieme in modo affidabile, sono necessari i connettori giusti e una certa disciplina su come aprire, utilizzare e chiudere le sessioni del database.La configurazione esatta dipende dal motore del database, ma i concetti sono simili.

Per flussi di lavoro leggeri e integrati, SQLite è spesso la scelta più semplice.Python include il modulo sqlite3 nella libreria standard, quindi è possibile creare un file di database, definire tabelle ed eseguire query senza installare software aggiuntivo. Questo è perfetto per prototipi, piccoli progetti di analisi o per insegnare concetti relazionali.

Per i database di livello server in genere si utilizzano driver specifici del motore o un ORMPostgreSQL è ampiamente utilizzato con psycopg2, SQL Server spesso si avvale di pyodbc o del driver ODBC di Microsoft, mentre MySQL/MariaDB si basano su mysql-connector-python o PyMySQL. Inoltre, SQLAlchemy fornisce un livello di astrazione di alto livello che consente di scrivere espressioni SQL portatili e gestire pool di connessioni.

Un modello di connessione robusto prevede la lettura delle credenziali da variabili d'ambiente o da un gestore di segreti, l'utilizzo di query parametrizzate per evitare l'iniezione di vulnerabilità e l'applicazione di una corretta gestione degli errori.Dopo ogni unità di lavoro, è necessario confermare o annullare esplicitamente le transazioni e rilasciare la connessione al pool o chiuderla, anziché mantenere aperte numerose sessioni inattive.

Con SQLAlchemy e pandas il flusso di lavoro diventa particolarmente fluidoSi crea un URL di connessione, si configura un motore e si utilizza `pandas.read_sql_query` per recuperare i risultati della query direttamente in un DataFrame. Da lì, si ha a disposizione tutta la potenza dell'ecosistema Python per pulire, analizzare ed esportare i dati.

Servizi di apprendimento automatico in SQL Server: problemi di integrazione tra R e Python

Microsoft SQL Server include una funzionalità chiamata Machine Learning Services che integra runtime di R e Python all'interno del motore del database.Ciò consente di richiamare script esterni tramite sp_execute_external_script. Questa funzionalità è potente per l'analisi all'interno del database, ma presenta una lunga lista di bug e limitazioni specifici della versione che è necessario comprendere.

I problemi di installazione e aggiornamento sono particolarmente frequenti in SQL Server 2016, 2017, 2019 e 2022.I problemi possono variare da componenti R mancanti su specifiche immagini di macchine virtuali Azure, a programmi di installazione Python incompleti nelle prime versioni di SQL Server 2017, fino a pacchetti di aggiornamento cumulativo (CU) che non richiedono l'aggiornamento offline di R. In alcuni casi è necessario passare parametri aggiuntivi come MRCACHEDIRECTORY sulla riga di comando per indicare al programma di installazione i file CAB memorizzati nella cache.

Esistono anche problemi di dipendenza specifici della piattaforma.Nelle versioni di SQL Server 2019 e successive per Linux, i runtime di R e Python potrebbero non avviarsi perché le librerie condivise come libc++.so.1 o libc++abi.so.1 non sono disponibili nel percorso delle librerie di estensibilità. Gli errori risultanti si manifestano spesso come messaggi generici del tipo "Impossibile comunicare con il runtime" in SQL Server, mentre i log di Launchpad rivelano la mancanza del file .so. Le soluzioni in genere prevedono la copia delle librerie condivise necessarie nella directory /opt/mssql-extensibility/lib o l'esposizione delle directory tramite mssql.conf.

Sui server Windows configurati con le impostazioni di crittografia FIPS esiste un'altra classe di errori di installazioneIl tentativo di abilitare i Servizi di apprendimento automatico o le estensioni del linguaggio può generare errori relativi all'incompatibilità della creazione di AppContainer con gli algoritmi convalidati FIPS della piattaforma Windows. La soluzione alternativa consiste nel disabilitare temporaneamente FIPS, completare l'installazione o l'aggiornamento e quindi riabilitare FIPS al termine della configurazione di SQL Server.

Alcuni aggiornamenti cumulativi introducono regressioni transitorie che influiscono sull'esecuzione degli script.Ad esempio, gli aggiornamenti cumulativi (CU) 5-7 di SQL Server 2017 includevano un bug in rlauncher.config quando il percorso della directory temporanea conteneva spazi, causando l'errore "impossibile creare R_TempDir" negli script R. Gli aggiornamenti cumulativi successivi hanno risolto questo problema, ma fino ad allora gli amministratori dovevano registrare nuovamente l'ambiente di scripting esterno utilizzando RegisterRExt.exe con i flag di disinstallazione e installazione.

Discrepanze di versione tra gli ambienti di runtime del client e del server

Un'altra fonte ricorrente di confusione riguarda la compatibilità di versione tra gli strumenti client (Microsoft R Client o pacchetti Python) e gli ambienti di runtime lato server (R Server o SQL Server Machine Learning Services).Quando si eseguono script remoti da un client su un'istanza di SQL Server meno recente, una mancata corrispondenza può causare errori espliciti o problemi di serializzazione meno evidenti.

In SQL Server 2016 R Services, le versioni della libreria R del client e del server devono corrispondere esattamenteL'esecuzione di Microsoft R Client 9.x su un server con R Server 8.0.3 genera messaggi che indicano che il client non è compatibile e suggeriscono di installare una versione corrispondente. Le versioni successive hanno attenuato questo requisito, ma se si verificano questi errori è necessario verificare entrambi i lati e aggiornare il server o installare un client compatibile.

La serializzazione e la deserializzazione dei modelli addestrati sono particolarmente sensibili alle differenze di versione.Con RevoScaleR in R e revoscalepy in Python, un modello serializzato con un'API più recente potrebbe non essere deserializzato correttamente su un server che utilizza un'infrastruttura di serializzazione meno recente, causando errori interni come errori memDecompress in R o NameError in Python quando rx_unserialize_model non è definito. L'aggiornamento dell'istanza di SQL Server almeno alla CU3 per SQL Server 2017 di solito risolve questi problemi di incompatibilità.

Anche i modelli pre-addestrati installati su SQL Server 2017 possono incorrere in limitazioni relative alla lunghezza del percorso.Le prime versioni memorizzavano i file binari dei modelli in strutture di directory profonde sotto il percorso predefinito dell'istanza e Python non era in grado di aprire i file perché il percorso completo superava i limiti del sistema operativo. Le soluzioni suggerite includevano l'installazione dei modelli in un percorso personalizzato più breve, l'installazione di SQL Server in una directory radice più breve o persino la creazione di collegamenti fisici NTFS con fsutil per esporre un alias più breve allo stesso file.

Quando si progetta una soluzione che utilizza SQL Server Machine Learning Services, è fondamentale bloccare le versioni e i livelli di CU (Configuration Unit) nell'ambito del piano di implementazione.Distribuire gli script su più server con diversi livelli di CU senza tenere traccia di questi dettagli è la ricetta per problemi di serializzazione e di runtime difficili da diagnosticare in seguito.

Gestione delle risorse, prestazioni e comportamento all'avvio a freddo

Anche quando SQL Server Machine Learning Services è installato correttamente e la versione è compatibile, è possibile che si raggiungano limiti di prestazioni a causa della gestione delle risorse e del pooling dei processi.Comprendere il comportamento della piattaforma di lancio e dei processi satellitari è fondamentale per garantire una latenza costante.

SQL Server crea pool di processi per utente, per database e per linguaggio per gli script esterniLa prima chiamata a sp_execute_external_script dopo un periodo di inattività fa sì che Launchpad avvii nuovi processi satellite per R o Python. Questo avvio a freddo può risultare notevolmente lento su server con carico elevato o macchine virtuali con risorse limitate. Le chiamate successive riutilizzano il pool di processi già avviato, pertanto la seconda e la terza esecuzione sono molto più veloci.

Se la latenza della prima chiamata è un problema, come negli scenari di punteggio in tempo reale, è possibile mantenere i pool caldi eseguendo periodicamente script leggeriMolti team programmano l'esecuzione di un semplice script "no-op" in R o Python tramite SQL Agent ogni pochi minuti, impedendo così che l'attività di pulizia inattiva arresti i processi satellite.

Nelle prime versioni di SQL Server 2016 Enterprise Edition, la memoria per gli script esterni era limitata a circa il 20% della RAM totale.Per un server da 32 GB, ciò significava che gli eseguibili di R potevano essere limitati a circa 6.4 GB per richiesta. Per modelli più grandi o set di dati di grandi dimensioni, questo diventa rapidamente un limite, causando errori di allocazione della memoria o un significativo utilizzo del paging. Gli amministratori devono rivedere le impostazioni predefinite correnti e regolare le impostazioni del gestore delle risorse quando si prevedono carichi di lavoro di machine learning complessi.

Il parallelismo è un'altra sottile limitazioneQuando si richiamano le librerie Microsoft ML o RevoScaleR dall'esterno di SQL Server (ad esempio, RGui), anche se l'edizione sottostante è Enterprise, tali librerie spesso operano in modalità a singolo thread. Analogamente, in SQL Server 2019 erano noti bug per cui gli script R che utilizzavano contesti RxLocalPar o il pacchetto parallelo di base potevano causare il blocco di SQL Server a causa di problemi di scrittura sul dispositivo nullo nell'ambiente di runtime sandbox.

Vincoli relativi al tipo di dati, alla codifica e allo schema durante la chiamata di script esterni

I tipi di dati e le codifiche sono una frequente fonte di comportamenti imprevisti quando si inviano dati SQL a R o Python tramite sp_execute_external_script.Non tutti i tipi SQL sono supportati e alcuni sono supportati solo parzialmente o convertiti silenziosamente, il che può comportare una perdita di precisione o stringhe corrotte, soprattutto con strutture complesse come array in SQL.

Le precedenti Cumulative Update (CU) di SQL Server 2017 presentavano forti limitazioni sui tipi numerici, decimali e monetari per gli schemi di output Python.Se combinati con WITH RESULT SETS e Python, i tipi non supportati producevano errori SqlSatelliteCall e messaggi che indicavano che erano consentiti solo bit, smallint, int, datetime, smallmoney, real e float (oltre parzialmente a char/varchar). I successivi aggiornamenti cumulativi (CU) hanno risolto questo problema, ma è comunque necessario prestare attenzione ai tipi di dati esposti ai runtime esterni.

Negli script R, i tipi money, numeric, decimal e bigint vengono tutti convertiti nel tipo numerico di R.Di conseguenza, i valori di grande entità o quelli con molte cifre decimali possono perdere precisione; i tipi di valuta possono generare avvisi relativi all'impossibilità di rappresentare accuratamente i valori in centesimi, e il tipo bigint supera il limite di 53 bit per gli interi in R, causando arrotondamenti nei bit meno significativi.

Anche le codifiche delle stringhe sono importantiIl passaggio di dati Unicode memorizzati in colonne varchar può corrompere i caratteri non ASCII perché le regole di confronto di SQL Server potrebbero non corrispondere alla codifica UTF-8 prevista da R o Python. Gli approcci consigliati sono di utilizzare le regole di confronto UTF-8 disponibili in SQL Server 2019 e versioni successive oppure di memorizzare il testo Unicode in nvarchar e gestire esplicitamente le conversioni nello script.

Alcune funzionalità SQL sono completamente vietate agli script esterniLe query che fanno riferimento a colonne Always Encrypted o a colonne mascherate non possono essere passate direttamente agli script R in determinati contesti; potrebbe essere necessario copiare i dati protetti in tabelle temporanee senza crittografia o mascheramento per l'analisi. Inoltre, in un contesto di calcolo di SQL Server, argomenti come colClasses in R non possono sovrascrivere i tipi di colonna; è necessario utilizzare CAST o CONVERT in T-SQL prima di passare i dati a R.

Anche i payload binari hanno regole specialiQuando si restituisce un tipo raw di R, il valore deve essere incluso nel dataframe di output anziché essere associato a un parametro di output. È supportato un solo set di output raw; se sono necessari più output binari, potrebbe essere necessario richiamare la stored procedure più volte o inviare dati a SQL tramite ODBC dall'interno dello script.

Problemi pratici durante l'installazione e l'estensione di Python in SQL Server

L'installazione e l'estensione dell'ambiente Python incluso in SQL Server Machine Learning Services sono più limitate rispetto a un'installazione autonoma di Anaconda o Python di sistema.Molti utenti riscontrano errori quando tentano di aggiungere pacchetti con pip o sqlmlutils, soprattutto su Windows con SQL Server 2019.

Su Windows, un problema frequente dopo l'installazione di SQL Server 2019 è che pip segnala problemi di configurazione TLS/SSL.Il programma segnala che il modulo ssl non è disponibile, anche se Python è chiaramente in grado di funzionare. La causa è in genere la mancanza delle DLL di OpenSSL (libssl-1_1-x64.dll e libcrypto-1_1-x64.dll) nella sottocartella DLLs di PYTHON_SERVICES. Copiando questi file dalla cartella Library\bin nella sottocartella DLLs e avviando un nuovo prompt dei comandi, di solito si ripristina la capacità di pip di effettuare richieste HTTPS.

Alcuni pacchetti di machine learning molto diffusi, come TensorFlow, presentano requisiti di dipendenza incompatibili.Il pacchetto TensorFlow potrebbe richiedere una versione di NumPy più recente di quella preinstallata nell'ambiente Python di SQL Server. Poiché NumPy è considerato un pacchetto di sistema, non è possibile aggiornarlo tramite sqlmlutils, pertanto i tentativi di installare TensorFlow in questo modo falliscono. È invece necessario richiamare direttamente l'eseguibile PYTHON_SERVICES con l'opzione -m pip e aggiornare o installare i pacchetti in tale ambiente, a volte dopo aver aggiornato manualmente i runtime ridistribuibili come Microsoft Visual C++.

Su Linux, il punto di ingresso pip incluso può essere estratto dalla confezionePer SQL Server 2019, l'esecuzione di pip da /opt/mssql/mlservices/runtime/python/bin potrebbe causare un errore di interprete non valido che punta a una posizione inesistente del server ML legacy. La soluzione consiste nello scaricare get-pip.py da PyPA ed eseguirlo con il binario Python corretto in /opt/mssql/mlservices/bin/python/python, riavviando di fatto pip per tale runtime.

Esistono anche sottili comportamenti relativi ai parametri di output varbinary e varchar negli script PythonSe la chiamata sp_execute_external_script espone un parametro OUTPUT di tipo varbinary(max) o large varchar e non si assegna un valore all'interno dello script Python, il componente BxlServer potrebbe generare errori e smettere di funzionare. Il comportamento più sicuro è quello di inizializzare esplicitamente tali parametri all'interno del codice Python, anche se si imposta semplicemente una stringa vuota o 0x0.

Flusso di lavoro classico SQL + Python con SQLite

Trascendendo le specificità di SQL Server, un metodo molto efficace per imparare e prototipare l'integrazione SQL-Python consiste nell'utilizzare SQLite con il modulo sqlite3 di Python.SQLite memorizza i dati in un singolo file, non richiede processi server separati e si comporta come un piccolo database relazionale con supporto SQL.

In SQLite, un database è semplicemente un file organizzato che memorizza dati strutturati su disco.Similmente a un dizionario Python, mappa le chiavi ai valori, ma aggiunge l'indicizzazione, un'archiviazione efficiente per grandi insiemi di dati e funzionalità di interrogazione. Le strutture ruotano attorno a tabelle (simili ai fogli di calcolo), righe (record) e colonne (campi). In una terminologia relazionale più formale, questi elementi sono relazioni, tuple e attributi.

Per iniziare, ci si connette a un file di database tramite sqlite3.connect.Se il file non esiste, SQLite lo crea. Dalla connessione si crea un oggetto cursore che funge da handle per l'esecuzione di comandi SQL e l'iterazione sui risultati. Il flusso di lavoro è analogo all'apertura di un file e alla lettura riga per riga, con la differenza che si eseguono istruzioni SQL anziché leggere testo semplice.

La creazione di una tabella richiede la specifica dei nomi delle colonne e dei tipi di dati.Sebbene SQLite sia piuttosto flessibile nella gestione dei tipi, definirli aiuta il motore a scegliere formati di archiviazione e strategie di indicizzazione efficienti. Ad esempio, una semplice tabella per i brani musicali può definire un titolo testuale e un numero intero che ne indica il numero di riproduzioni. Una volta creata la tabella con CREATE TABLE, è possibile inserire righe utilizzando INSERT e segnaposto per i parametri (punti interrogativi) per associare in modo sicuro i valori Python.

Utilizzo di SQL da Python: INSERT, SELECT, UPDATE, DELETE

SQL offre quattro operazioni fondamentali: INSERT, SELECT, UPDATE e DELETE, che si adattano perfettamente al codice Python che utilizza sqlite3.Ogni operazione manipola le righe di una tabella e la clausola WHERE consente di selezionare record specifici.

INSERT aggiunge nuovi record a una tabellaIn Python, si chiama `cursor.execute` con un'istruzione come `INSERT INTO Songs (title, plays) VALUES (?, ?)`, passando una tupla di parametri. L'utilizzo di segnaposto al posto della concatenazione di stringhe evita le iniezioni SQL e gestisce correttamente le virgolette. Dopo gli inserimenti, si chiama `conn.commit` per salvare le modifiche dalla transazione nel file del database.

L'istruzione SELECT legge i dati dal database, filtrando e ordinando facoltativamente i risultati.Un semplice titolo SELECT, plays FROM Songs trasforma il cursore in un iterabile sulle righe. Per set di risultati di grandi dimensioni, SQLite non carica tutte le righe in memoria contemporaneamente; le restituisce invece man mano che il ciclo for itera. È possibile selezionare tutte le colonne con * o specificare un sottoinsieme, e si possono usare WHERE, ORDER BY e LIMIT per limitare e ordinare i record.

DELETE rimuove le righe in modo permanente in base a una condizioneUn'istruzione come DELETE FROM Songs WHERE plays < 100 elimina tutti i brani con un basso numero di riproduzioni. Non è possibile annullare l'operazione, quindi nei tutorial è comune eliminare le righe alla fine di uno script per rendere idempotenti gli esempi rieseguiti. È necessario confermare le modifiche dopo le eliminazioni se si desidera che vengano salvate.

UPDATE modifica le colonne nelle righe esistentiSi specifica la tabella, una clausola SET con i nuovi valori e una clausola WHERE facoltativa. Ad esempio, UPDATE Songs SET plays = 16 WHERE title = 'My Way' modifica ogni riga il cui titolo corrisponde a quella stringa. Se si omette la clausola WHERE, verranno aggiornate tutte le righe della tabella, il che è spesso causa di modifiche in blocco accidentali.

Creazione di un crawler per Twitter con SQLite e Python

Un esempio pratico di come combinare SQL e Python è un piccolo crawler di Twitter che memorizza lo stato in un database SQLite.Sebbene le API e le politiche di Twitter cambino nel tempo, l'idea architettonica rimane valida: l'obiettivo è esplorare le relazioni di amicizia, evitare di visitare ripetutamente gli stessi account e raccogliere dati sulla popolarità, il tutto potendo interrompere e riprendere l'attività senza perdere i progressi.

Il crawler mantiene una tabella di account Twitter e tiene traccia se ciascuno è stato recuperato e quante volte appare come amicoOgni riga contiene il nome dell'account, un flag che indica se hai già recuperato la sua lista di amici e un contatore che indica quante volte quell'account è apparso tra gli "amici" di altri. Questo ti permette di stimare la popolarità all'interno della rete campionata.

Il ciclo principale richiede all'utente di inserire un nome utente di Twitter o un comando di uscita.Se l'utente preme semplicemente Invio, lo script interroga il database per trovare l'account successivo con `recovered` pari a 0 e lo utilizza come obiettivo successivo. Quindi chiama l'endpoint friends/list di Twitter, analizza la risposta JSON, aggiorna il flag `recovered` per l'account corrente e inserisce o aggiorna ciascun amico nel database, incrementando i relativi contatori di amicizia secondo necessità.

Poiché tutti i dati sono memorizzati in SQLite, è possibile terminare il crawler e riavviarlo in un secondo momento.Il database funge da coda persistente e da archivio di stato. Uno script di supporto separato può visualizzare il contenuto della tabella di Twitter, consentendo di esaminare quali account sono noti, quali sono stati visitati e quante volte ciascuno è apparso come amico. Questo schema, ovvero la persistenza dello stato di scansione in un database relazionale, si generalizza bene ad altre attività di scansione web o API.

Principi fondamentali della modellazione dei dati: chiavi primarie, chiavi esterne e normalizzazione

Archiviare tutte le informazioni di Twitter in un'unica tabella porta rapidamente a problemi di scalabilità e ridondanza.Un approccio più solido consiste nel normalizzare i dati separando le entità (persone) dalle relazioni (chi segue chi) e collegandole tramite chiavi.

Una tabella delle persone in genere utilizza una chiave primaria intera come identificatore internoIn SQLite è possibile dichiarare `id` come `INTEGER PRIMARY KEY` e il motore genererà automaticamente un intero univoco per ogni riga inserita. È inoltre possibile includere una chiave logica, come ad esempio l'handle di Twitter, contrassegnata come `UNIQUE` per evitare duplicati. La chiave logica è quella utilizzata dal mondo esterno, mentre la chiave primaria è quella a cui fanno riferimento il codice e le chiavi esterne.

Una tabella di follow separata cattura quindi le relazioni utilizzando chiavi esterneOgni riga contiene una coppia di ID utente, solitamente denominati from_id e to_id (o simili), che indicano che una persona segue un'altra. È possibile dichiarare un vincolo UNIQUE sulla combinazione di queste due colonne, il che impedisce di inserire accidentalmente la stessa relazione due volte.

La normalizzazione, ovvero la memorizzazione di ogni informazione una sola volta e il suo riferimento altrove tramite chiavi, evita la duplicazione, consente di risparmiare spazio e migliora le prestazioni.Invece di salvare la stessa stringa del nome utente in milioni di righe di relazione, la si salva una sola volta nella tabella delle persone e poi la si richiama tramite ID interi. Gli interi sono più veloci da confrontare e indicizzare, il che diventa cruciale su larga scala.

Nel codice Python, questo schema porta a modelli comuni per l'inserimento o il recupero di utenti e relazioni.Prima di inserire una relazione, è necessario assicurarsi che entrambi i partecipanti esistano nella tabella delle persone: si esegue una SELECT tramite chiave logica e, se non viene trovata alcuna riga, si esegue un'INSERT acquisendo l'ultimo ID riga come ID della nuova persona. Solo a questo punto si esegue un'INSERT OR IGNORE di una riga nella tabella successiva che collega tali ID. I vincoli e l'operazione OR IGNORE lavorano insieme per mantenere la coerenza dei dati senza eccessivi controlli manuali.

Utilizzo di JOIN per combinare tabelle correlate in SQL

Una volta che i dati sono distribuiti su più tabelle normalizzate, ci si affida alle JOIN SQL per ricostruire la vista combinata necessariaUn'operazione JOIN unisce le righe di due tabelle in base alla corrispondenza dei valori chiave, creando di fatto una riga virtuale più ampia per ogni corrispondenza.

Nell'esempio di Twitter, unendo le tabelle "follower" e "people" è possibile vedere chi segue un determinato utente o chi lo segue.Una query come SELECT * FROM Follow JOIN People ON Follow.to_id = People.id WHERE Follow.from_id = 2 recupera tutte le persone seguite dall'utente il cui ID interno è 2. La clausola JOIN indica al database di associare Follow.to_id a People.id per ogni riga, e la condizione WHERE limita l'utente di origine.

Il set di risultati contiene colonne provenienti da entrambe le tabellePotresti visualizzare i due ID interi dalla tabella dei follower, seguiti dalla riga completa della persona (ID, handle, flag di recupero) dalla tabella delle persone. Quando un utente segue molti account, viene visualizzata una riga combinata per ogni relazione, duplicando alcune colonne dalla persona di origine ma consentendo un facile accesso agli attributi della persona di destinazione.

Le JOIN sono disponibili in diverse varianti: INNER, LEFT, RIGHT, FULL, ma i progetti normalizzati in genere utilizzano le INNER JOIN per le relazioni principali.. L'INNER JOIN mantiene solo le righe che hanno corrispondenze su entrambi i lati, il che è in linea con l'idea che una riga di relazione dovrebbe sempre fare riferimento a persone esistenti. Durante il debug o l'esplorazione, è possibile SELEZIONARE alcune righe da ciascuna tabella e da una query JOIN per verificare che il modello si comporti come previsto.

Questo schema relazionale si ritrova ovunque: utenti e ruoli, clienti e ordini, prodotti e categorie, post e commenti.Una volta acquisita familiarità con la progettazione di tabelle con chiavi primarie e chiavi esterne e con la scrittura di query JOIN, sarà possibile modellare e interrogare domini complessi, continuando a sfruttare Python per la logica e l'analisi di livello superiore.

In definitiva, padroneggiare SQL e Python significa comprendere non solo come scrivere query o script puliti, ma anche come runtime, driver, tipi di dati e limiti delle risorse interagiscono tra le diverse piattaforme.Dalla diagnosi di errori criptici di Machine Learning Services in SQL Server e dalla gestione delle dipendenze delle librerie in ambienti Python isolati, alla progettazione di schemi SQLite normalizzati e all'orchestrazione di pipeline di analisi end-to-end, maggiore è la fluidità con cui si passa dal database al codice, più robuste e scalabili diventeranno le soluzioni di dati.

análisis de datos con SQL
Articolo correlato:
Analisi dei dati con SQL: dal nulla all'esperto con esempi e tecniche
Related posts: