Gestion de base SQLite

Classes et fonctions liées à la gestion de bases SQL.

Created on Mon Nov 23 08:42:43 2020

@author: Cyrile Delestre

dstk.data._sql.csv2sql(path_csv_or_df: Union[str, pandas.core.frame.DataFrame], path_sql: str, table_name: str, n_jobs: int = 1, if_exists: str = 'append', **csv_opt)[source]

Fonction permettant de convertir un fichier CSV en base SQLite3. La méthode permet de ne pas charger le CSV en RAM si ce dernier est trop gros.

Parameters:
path_csvUnion[str, pd.DataFrame]

chemin du csv ou DataFrame

path_sqlstr

chemin de la base sql

table_namestr

nom de la table sql

n_jobsint

nombre de jobs (gain si gros chunck), par défaut 1

if_existsstr

comportement si l’indice existe déjà dans la table sql. Peut être : ‘fail’, ‘replace’, ‘append’, par défaut ‘append’

**csv_opt :

arguments de pandas.read_csv

Examples

Transfert d’un CSV trop gros pour être mis en RAM vers une base SQLite3.

>>> from dstk.data import csv2sql
>>> 
>>> csv2sql(
>>>     path_csv_or_df="data/mon_gros_csv.csv",
>>>     path_sql="data/ma_table_sql.db",
>>>     table_name="nom_de_ma_table",
>>>     n_jobs=4,       # Nombre de jobs en parallèle
>>>     chunksize=1000  # taille du chunker (1000 par 1000 ligne)
>>> );

Attention, dans notre cas ce sera 4 lignes qui seront stockées en RAM : n_jobs*chunksize

dstk.data._sql.index_sql(path_sql: str, table_name: str, list_keys: list, index_name: str = 'idx', unique: bool = False)[source]

Fonction créant un index pour une base SQLite. Créer un index peremet d’accélérer grandement les filtres sur une base, car l’index est mise en RAM.

Parameters:
path_sqlstr

chemin de la base sql

table_namestr

nom de la table sql

list_keys: list

list contenant les colonnes pour la génération de l’index

index_namestr

nom de l’index, par défaut ‘idx’

uniquebool

si l’index est unique ou non, par défaut false

Notes

Commande à n’exécuter qu’une seule fois. Si plusieurs index sont créés les noms ‘index_name’ douvent être uniques.

Examples

Je possède une base base.db et je sais que je vais de manière très fréquente un filtrage sur la colonne A et B du type :

>>> from dstk.data import PandasSQLite
>>> 
>>> arg1, arg2 = '...', '...'
>>> with PandasSQLite("data/base.db") as db:
>>>     data = db(
>>>         "SELECT * FROM toto "
>>>         f"WHERE A='{arg1}' AND B='{arg2}';"
>>>     )

Cette commande ira beaucoup plus vite si au préalable en aillant fait :

>>> from dstk.data import index_sql
>>> 
>>> index_sql(
>>>     path_sql="data/base.db",
>>>     table_name="toto",
>>>     list_keys=['A', 'B']
>>> );