2017-10-17 5 views
0

Curieux de savoir s'il est possible d'éviter raisonnablement la création d'une extension c sqlite chargeable et de créer directement un "script" à l'intérieur de la console pour faire quelques transformations pour moi. Par exemple, la documentation sqlite a un site consacré à certaines fonctions de base https://www.sqlite.org/lang_corefunc.html comme "ABS" ou "random" mais il serait pratique de créer des scripts côté client en TCL/JavaScript ou n'importe quel langage pour faire d'autres manipulations. Par exemple:Est-il possible d'ajouter des scripts sqlite dans la console sqlite sans avoir besoin de créer une extension chargeable c/C++

# User script 
proc reversedResult(result) { 
    return [string reverse $a] 
} 


select reversedResult(db.name) from users where id=1 

EDIT:

La base de données est chargé directement à partir d'un fichier CSV à l'aide d'un script shell SQLite comme suit:

-- created at 2017-10-17 10:43:42.430129 
-- script path /tmp/popDb/cmd1508226222.txt 

CREATE TABLE 'hash_gen' ( 
         'key' TEXT PRIMARY KEY NOT NULL, 
         'hash' INT NOT NULL <<<<<< HERE I WANT TO USE A HASHING FUNCTION 
        ); 
CREATE INDEX hash_gen_index ON hash_gen (hash); 

CREATE TABLE 'info' (
         key TEXT PRIMARY KEY NOT NULL, 
         value TEXT NOT NULL 
        ); 

INSERT INTO 'info' VALUES('primary_table','products'); 

INSERT INTO 'info' VALUES('primary_key','sku'); 

INSERT INTO 'info' VALUES('db_version','1.0.0'); 

CREATE TABLE products (
sku TEXT PRIMARY KEY NOT NULL, 
...many more columns... 
); 
CREATE TRIGGER hash_gen_trigger 
    AFTER INSERT 
    ON 'products' 
    BEGIN 
     INSERT INTO hash_gen(key,hash) VALUES(new.sku,MY_CUSTOM_HASH_FUNCTION(new.sku,...all other fields,....)); 
END; 
.mode csv 
.import /tmp/inputCSV/1503331189113.csv products 
.... 

<<<< MY_CUSTOM_HASH_FUNCTION(input) {return custom_hash_on_(input)...} 

puis enfin la db est créé dans le cadre d'un flux distinct (dans un outil différent dans un langage de programmation différent (scala)):

sqlite3 /output/path/db.db < /tmp/popDb/cmd1508226222.txt 

Répondre

1

Les pilotes SQLite dans la plupart des langages de script (sauf JavaScript) permettent de créer des fonctions définies par l'utilisateur.

Par exemple, l'SQLite Tcl documentation dit:

La méthode "fonction" enregistre de nouvelles fonctions SQL avec le moteur SQLite. Les arguments sont le nom de la nouvelle fonction SQL et une commande TCL qui implémente cette fonction. Les arguments de la fonction sont ajoutés à la commande TCL avant d'être invoqués.

L'exemple suivant crée une nouvelle fonction SQL nommée « Hex » qui convertit son argument numérique pour une chaîne codée hexadécimal:

db function hex {format 0x%X} 

Cependant, la ligne de commande shell sqlite3 lui-même n'utilise pas langage de script; il n'y a pas de mécanisme pour y ajouter des fonctions, sauf en chargeant un module.

+0

Je suis d'accord mais puisque je n'utilise pas directement un script TCL mais plutôt un script shell SQLITE je ne sais pas comment ajouter ces fonctions. c'est-à-dire un fichier "commande" SQL. Je mettrai à jour ma question pour refléter que –

+0

Votre meilleur pari serait probablement d'implémenter le shell 'sqlite3' dans Tcl. –