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'] >>> );