[PYTHON] Avec SQLite3, ajoutez seulement deux lignes et utilisez la bibliothèque d'extension (fonction SQL étendue)!

introduction

Avec SQLite3, il est possible d'introduire une bibliothèque partagée comme bibliothèque d'extension, similaire à EXTENSION (extension) de PostgreSQL. En fait, vous pouvez utiliser la bibliothèque d'extension en ajoutant seulement deux lignes, ** enable_load_extension et load_extension! ** A titre d'exemple, introduisons et utilisons les fonctions d'extension SQL (extension-functions.c) publiées dans SQLite Contributed Files. SQLite3 a moins de fonctions SQL que les autres SGBDR, mais il peut être complété par l'introduction de fonctions SQL étendues. Introduisons-le avec SQLite3 CLI (Command Line Intferface), python3, langage C sur CentOS7.

Obtention et création de fonctions SQL étendues

Téléchargez la fonction SQL étendue depuis SQLite Contributed Files et compilez-la pour créer une bibliothèque partagée.

$ wget http://www.sqlite.org/contrib/download/extension-functions.c?get=25
$ mv extension-functions.c\?get\=25 extension-functions.c
$ gcc -fPIC -lm -shared extension-functions.c -o libsqlitefunctions.so
$ ls lib*
libsqlite3.la  libsqlitefunctions.so  libtclsqlite3.la  libtool

Utiliser la bibliothèque d'extension avec l'interface de ligne de commande SQLite3

Utilisez la CLI SQLite3 pour charger la bibliothèque partagée de fonctions SQL étendues avec la commande .load et essayez d'utiliser la fonction acos.
Avant d'exécuter la commande .load, il y avait une erreur indiquant que la fonction acos n'existait pas, mais après son exécution, vous pouvez confirmer que la fonction acos est exécutée sans aucun problème.

$ sqlite3 test1.db
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> SELECT acos(0.5);
Error: no such function: acos
sqlite> .load ./libsqlitefunctions.so
sqlite> SELECT acos(0.5);
1.0471975511966

Utiliser la bibliothèque d'extensions avec python3

Chargez la bibliothèque partagée de fonctions SQL étendues dans python3 et essayez d'utiliser la fonction acos.
En python3, la fonction load_extension est désactivée, alors activez d'abord la fonction load_extension avec la méthode enable_load_extension, puis chargez la bibliothèque partagée de la fonction SQL étendue avec la méthode load_extension. Vous pouvez voir que la fonction acos est exécutée sans aucun problème et que la valeur est sortie.

python3

$ python3
Python 3.6.8 (default, Aug  7 2019, 17:28:10) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> con = sqlite3.connect(":memory:")
>>> con.enable_load_extension(True)
>>> con.load_extension("./libsqlitefunctions.so")
>>> cur = con.cursor()
>>> cur.execute("SELECT acos(0.5)")
<sqlite3.Cursor object at 0x7fa84fdf3c00>
>>> cur.fetchone()
(1.0471975511965979,)

Utiliser la bibliothèque d'extensions en langage C

Chargez la bibliothèque partagée de fonctions SQL étendues dans un programme en langage C et essayez d'utiliser la fonction acos.
Dans la version par défaut, la fonction load_extension est désactivée, alors activez d'abord la fonction load_extension avec la fonction sqlite3_enable_load_extension, puis chargez la bibliothèque partagée de la fonction SQL étendue avec la méthode sqlite3_load_extension.

#include <stdio.h>
#include <assert.h>
#include "sqlite3.h"

int main(int argc, char **argv){
  sqlite3 *db = NULL;
  int rc = SQLITE_OK;
  char *sql = "SELECT acos(0.5);";
  char *zErrMsg = NULL;
  sqlite3_stmt *stmt = NULL;

  rc = sqlite3_open(":memory:", &db);
  assert(rc==SQLITE_OK);
  sqlite3_enable_load_extension(db, 1);
  assert(rc==SQLITE_OK);
  rc = sqlite3_load_extension(db,"./libsqlitefunctions.so", NULL,&zErrMsg);
  assert(rc==SQLITE_OK);
  rc = sqlite3_prepare(db, sql, -1, &stmt, NULL);
  sqlite3_reset(stmt);
  while (SQLITE_ROW == (rc = sqlite3_step(stmt))){
    double  value = sqlite3_column_double(stmt, 0);
    printf("%lf\n", value);
  }
  assert(rc==SQLITE_DONE);
  sqlite3_finalize(stmt);
  sqlite3_close(db);
  return(0);
}

Si vous compilez et exécutez comme suit, vous pouvez voir que la fonction acos est exécutée sans aucun problème et la valeur est sortie.

$ gcc -Wall -o evalext evalext.c -lsqlite3 -L./.lib -I./
$ ./evalext 
1.047198

Résumé

Dans SQLite3, comme introduit cette fois, vous pouvez facilement incorporer la bibliothèque partagée dans SQLite3 en tant que bibliothèque d'extension pour étendre ses fonctions. Diverses bibliothèques d'extensions sont ouvertes au public, mais vous pouvez étendre les fonctions d'origine en créant votre propre bibliothèque d'extensions.

Si vous trouvez des erreurs ou des préoccupations concernant la description, nous vous serions reconnaissants de bien vouloir nous faire part de vos commentaires dans la demande de modification ou le commentaire.

Annexe: Description des fonctions SQL étendues

Les fonctions mathématiques, les fonctions de chaîne et les fonctions d'agrégation suivantes sont disponibles pour les fonctions SQL étendues.

Fonction mathématique

Nom de la fonction                     La description
acos(N) Arc cosinus de la valeur numérique spécifiée par N(Cosinus inverse)Retour.
asin(N) Signe d'arc de la valeur numérique spécifiée par N(Sinus inverse)Retour.
atan(N) Arc tangente de la valeur numérique spécifiée par N(Connexion positive inverse)Retour.
atn2(N1, N2) N1,Arc tangente de la valeur numérique spécifiée par N2(Connexion positive inverse)Retour.
atan2(N1, N2) N1,Arc tangente de la valeur numérique spécifiée par N2(Connexion positive inverse)Retour.
acosh(N) Ark cosinus hyperbolique du nombre spécifié par N(Cosinus inversé à double courbe)Retour.
asinh(N) Arc signe hyperbolique avec le nombre spécifié par N(Sinus bicurve inversé))Retour.
atanh(N) Arc tangente hyperbolique avec le nombre spécifié par N(Tangente double courbe inversée))Retour.
difference(S1, S2) S1,SOUNDEX pour l'expression de caractère spécifiée dans S2()Mesure la différence entre les valeurs et renvoie une valeur entière.
degrees(N) Convertit et renvoie le radian spécifié par N.
radians(N) Convertit le degré spécifié par N en Radian et le renvoie.
cos(N) Cosinus du nombre spécifié par N(cosinus)Retour.
sin(N) Signe du nombre spécifié par N(sinus)Retour.
tan(N) Tangente du nombre spécifié par N(tangente)Retour.
cot(N) Cotangente du nombre spécifié par N(Marge)Retour.
cosh(N) Cosinus hyperbolique du nombre spécifié par N(Cosinus double courbe)Retour.
sinh(N) Signe hyperbolique du nombre spécifié par N(Sinus bi-courbe)Retour.
tanh(N) Tangente hyperbolique avec le nombre spécifié par N(Tangente double courbe)Retour.
coth(N) Cotangente hyperbolique avec le nombre spécifié par N(Marge de courbe double)Retour.
exp Logarithmique naturel e(2.718281…)Renvoie la valeur multipliée par le nombre spécifié par N.
log(N) Renvoie le logarithme naturel du nombre spécifié par N.
log10(N) Renvoie le journal de base 10 du nombre spécifié par N.
power(N1, N2) Renvoie la valeur obtenue en multipliant le nombre spécifié par N1 par le nombre spécifié par N2.
sign(N) Spécifié par N et positif comme signe numérique(+1),zéro(0),négatif(-1)Renvoie l'un des.
sqrt(N) Renvoie la valeur au carré du nombre spécifié par N.
square(N) Renvoie le carré du nombre spécifié par N.
ceil(N) Renvoie la valeur arrondie à partir du nombre spécifié par N.
floor(N) Renvoie la valeur avec le nombre spécifié par N tronqué.
pi Renvoie une valeur constante de π sous forme de valeur à virgule flottante.

Fonction de chaîne

Nom de la fonction                     La description
replicate(S, N) Renvoie la chaîne spécifiée par S, répétée le nombre de fois spécifié par N.
charindex(S1, S2[, N]) Renvoie la position de début de la chaîne spécifiée par S2 à partir de la chaîne spécifiée par S1. Si N est spécifié, ce sera la position pour démarrer la recherche.
leftstr(S, N) Renvoie la chaîne à partir du début de la chaîne spécifiée par S par le nombre spécifié par N.
rightstr(S, N) Renvoie la chaîne à partir de la fin de la chaîne spécifiée par S par le nombre spécifié par N.
reverse(S) Inverse et renvoie la chaîne spécifiée par S.
proper(S) Renvoie uniquement le début de chaque mot de la chaîne spécifiée par S, converti en majuscules et les autres en majuscules.
padl(S, N) Renvoie la chaîne avec N espaces supplémentaires avant le début de la chaîne spécifiée par S.
padr(S, N) Renvoie la chaîne avec N espaces ajoutés à la fin de la chaîne spécifiée par S.
padc(S, N) Renvoie la chaîne, en ajoutant N espaces avant et après le début et la fin de la chaîne spécifiée par S, respectivement.
strfilter(S1, S2) Renvoie uniquement les caractères de la chaîne spécifiée dans S1 qui existent dans la chaîne spécifiée dans S2.

Fonction d'agrégation

Nom de la fonction                     La description
stdev(N) L'écart type est calculé et renvoyé à partir de toutes les valeurs numériques spécifiées par N.
variance(N) Il est spécifié par N et renvoie la variance de tous les nombres.
mode(N) La valeur la plus fréquente est calculée et renvoyée à partir de toutes les valeurs numériques spécifiées par N.
median(N) La valeur médiane est calculée et renvoyée à partir de toutes les valeurs numériques spécifiées par N.
lower_quartile(N) Recherche et renvoie le quadrant inférieur de tous les nombres spécifiés par N.
upper_quartile(N) Recherche et renvoie le quadrant supérieur de tous les nombres spécifiés par N.

référence

J'ai évoqué les informations suivantes.

Recommended Posts

Avec SQLite3, ajoutez seulement deux lignes et utilisez la bibliothèque d'extension (fonction SQL étendue)!
Utilisez l'application LibreOffice en Python (3) Ajouter une bibliothèque
Nous avons étendu le Python Proxy, qui exécute Proxy en seulement 200 lignes, pour ajouter un refus d'accès.
[VueSlsApp] Spécifiez PYTHONPATH dans Lambda et utilisez simplement la bibliothèque externe
Déployer et utiliser le modèle de prédiction créé en Python sur SQL Server
Ajouter des lignes et du texte sur l'image
Comment utiliser la bibliothèque C en Python
Utilisez la clause LIKE avec golang x SQLite3
[C / C ++] Passez la valeur calculée en C / C ++ à une fonction python pour exécuter le processus et utilisez cette valeur en C / C ++.