2017-10-17 6 views
0

ロード可能なc sqliteエクステンションの作成を "避ける"ことが合理的な方法で可能かどうかを知り、私のためにいくつかの変換を行うためにコンソールの中に。たとえば、sqliteのマニュアルには、や"random"のようないくつかのコア関数https://www.sqlite.org/lang_corefunc.htmlのサイトがありますが、TCL/JavaScriptでクライアント側のスクリプトを作成すると便利です。例えば:sqliteのスクリプトをsqliteコンソールに追加することは可能ですか?c/C++のロード可能なエクステンションの作成のオーバーヘッドなし

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


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

EDIT:

次のようにデータベースをSQLiteのシェルスクリプトを使用して、CSVファイルから直接ロードされます。最後に、次いで

-- 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)...} 

とdbは別のフローの一部として作成されます(別のプログラミング言語(スカラ)の別のツールで):

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

答えて

1

ほとんどのスクリプト言語(JavaScriptを除く)のSQLiteドライバでは、ユーザー定義関数を作成できます。例えば

SQLite Tcl documentationは言う:

"機能" の方法は、SQLiteのエンジンと新しいSQL関数を登録します。引数は、新しいSQL関数の名前と、その関数を実装するTCLコマンドです。関数の引数は、呼び出される前にTCLコマンドに追加されます。しかし

db function hex {format 0x%X} 

、自身がいずれかを使用していないsqlite3コマンドラインシェル:

次の例は、16進エンコードされた文字列にして、数値引数を変換し、「進」という名前の新しいSQL関数を作成しますスクリプト言語。モジュールをロードする以外は、関数を追加するメカニズムはありません。

+0

私はTCLスクリプトを直接使用するのではなく、むしろそれらの機能を追加する方法がわからないSQLiteシェルスクリプトを使用しているので同意します。すなわちSQLの「コマンド」ファイルである。 –

+0

あなたの最善の策はおそらくTclに 'sqlite3'シェルを実装することでしょう。 –

関連する問題