[PYTHON] Fügen Sie mit SQLite3 nur zwei Zeilen hinzu und verwenden Sie die Erweiterungsbibliothek (erweiterte SQL-Funktion)!

Einführung

Mit SQLite3 ist es möglich, eine gemeinsam genutzte Bibliothek als Erweiterungsbibliothek einzuführen, ähnlich der EXTENSION (Erweiterung) von PostgreSQL. Tatsächlich können Sie die Erweiterungsbibliothek verwenden, indem Sie nur zwei Zeilen hinzufügen: ** enable_load_extension und load_extension! ** Lassen Sie uns als Beispiel die in SQLite Contributed Files veröffentlichten Erweiterungs-SQL-Funktionen (extension-functions.c) einführen und verwenden. SQLite3 verfügt über weniger SQL-Funktionen als andere RDBMS, kann jedoch durch die Einführung erweiterter SQL-Funktionen ergänzt werden. Lassen Sie es uns mit SQLite3 CLI (Command Line Intferface), Python3, C-Sprache unter CentOS7 einführen.

Abrufen und Erstellen erweiterter SQL-Funktionen

Laden Sie die erweiterte SQL-Funktion von SQLite Contributed Files herunter und kompilieren Sie sie, um eine gemeinsam genutzte Bibliothek zu erstellen.

$ 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

Verwenden Sie die Erweiterungsbibliothek mit SQLite3 CLI

Verwenden Sie die SQLite3-CLI, um die gemeinsam genutzte Bibliothek erweiterter SQL-Funktionen mit dem Befehl .load zu laden, und versuchen Sie, die acos-Funktion zu verwenden.
Vor dem Ausführen des Befehls .load ist ein Fehler aufgetreten, dass die acos-Funktion nicht vorhanden war. Nach dem Ausführen können Sie jedoch bestätigen, dass die acos-Funktion problemlos ausgeführt wird.

$ 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

Verwenden Sie die Erweiterungsbibliothek mit python3

Laden Sie die gemeinsam genutzte Bibliothek der erweiterten SQL-Funktion mit python3 und versuchen Sie, die acos-Funktion zu verwenden.
In Python3 ist die Funktion load_extension deaktiviert. Aktivieren Sie daher zuerst die Funktion load_extension mit der Methode enable_load_extension und dann die gemeinsam genutzte Bibliothek der erweiterten SQL-Funktion mit der Methode load_extension. Sie sehen, dass die acos-Funktion problemlos ausgeführt wird und der Wert ausgegeben wird.

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,)

Verwenden Sie die Erweiterungsbibliothek in der Sprache C.

Laden Sie die gemeinsam genutzte Bibliothek erweiterter SQL-Funktionen in ein C-Sprachprogramm und versuchen Sie, die acos-Funktion zu verwenden.
Im Standard-Build ist die Funktion load_extension deaktiviert. Aktivieren Sie daher zuerst die Funktion load_extension mit der Funktion sqlite3_enable_load_extension und laden Sie dann die gemeinsam genutzte Bibliothek der erweiterten SQL-Funktion mit der Methode 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);
}

Wenn Sie wie folgt kompilieren und ausführen, können Sie sehen, dass die acos-Funktion problemlos ausgeführt wird und der Wert ausgegeben wird.

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

Zusammenfassung

In SQLite3, wie dieses Mal eingeführt, können Sie die gemeinsam genutzte Bibliothek problemlos als Erweiterungsbibliothek in SQLite3 integrieren, um ihre Funktionen zu erweitern. Verschiedene Erweiterungsbibliotheken sind öffentlich zugänglich. Sie können die ursprünglichen Funktionen jedoch erweitern, indem Sie eine eigene Erweiterungsbibliothek erstellen.

Wenn Sie Fehler oder Bedenken bezüglich der Beschreibung finden, würden wir uns freuen, wenn Sie uns in der Bearbeitungsanfrage oder im Kommentar Feedback geben könnten.

Anhang: Beschreibung der erweiterten SQL-Funktionen

Die folgenden mathematischen Funktionen, Zeichenfolgenfunktionen und Aggregatfunktionen stehen für erweiterte SQL-Funktionen zur Verfügung.

Mathematische Funktion

Funktionsname                     Erläuterung
acos(N) Bogenkosinus des durch N angegebenen numerischen Wertes(Kosinus umkehren)Kehrt zurück.
asin(N) Bogenzeichen des durch N angegebenen numerischen Wertes(Inverser Sinus)Kehrt zurück.
atan(N) Arcustangens des durch N angegebenen numerischen Wertes(Positive Verbindung umkehren)Kehrt zurück.
atn2(N1, N2) N1,Arcustangens des durch N2 angegebenen numerischen Wertes(Positive Verbindung umkehren)Kehrt zurück.
atan2(N1, N2) N1,Arcustangens des durch N2 angegebenen numerischen Wertes(Positive Verbindung umkehren)Kehrt zurück.
acosh(N) Ark hyperbolischer Kosinus der durch N angegebenen Zahl(Invertierter Doppelkurven-Cosinus)Kehrt zurück.
asinh(N) Bogen hyperbolisches Zeichen mit der durch N angegebenen Nummer(Invertierter Bicurve-Sinus))Kehrt zurück.
atanh(N) Bogen hyperbolische Tangente mit der durch N angegebenen Zahl(Invertierte Doppelkurventangente))Kehrt zurück.
difference(S1, S2) S1,SOUNDEX für den in S2 angegebenen Zeichenausdruck()Misst die Differenz zwischen Werten und gibt einen ganzzahligen Wert zurück.
degrees(N) Konvertiert das von N angegebene Bogenmaß und gibt es zurück.
radians(N) Konvertiert den von N angegebenen Grad in Radian und gibt ihn zurück.
cos(N) Kosinus der durch N angegebenen Zahl(Kosinus)Kehrt zurück.
sin(N) Vorzeichen der durch N angegebenen Nummer(Sinus)Kehrt zurück.
tan(N) Tangens der durch N angegebenen Zahl(Tangente)Kehrt zurück.
cot(N) Kotangens der durch N angegebenen Zahl(Spanne)Kehrt zurück.
cosh(N) Hyperbolischer Kosinus der durch N angegebenen Zahl(Doppelkurven-Cosinus)Kehrt zurück.
sinh(N) Hyperbolisches Vorzeichen der durch N angegebenen Nummer(Bi-Kurven-Sinus)Kehrt zurück.
tanh(N) Hyperbolische Tangente mit der durch N angegebenen Zahl(Doppelte Kurventangente)Kehrt zurück.
coth(N) Hyperbolischer Kotangens mit der durch N angegebenen Nummer(Bikurve Konjunktiv)Kehrt zurück.
exp Natürlicher Logarithmus e(2.718281…)Gibt den Wert multipliziert mit der durch N angegebenen Zahl zurück.
log(N) Gibt den natürlichen Logarithmus der durch N angegebenen Zahl zurück.
log10(N) Gibt das Basis-10-Protokoll der von N angegebenen Nummer zurück.
power(N1, N2) Gibt den Wert zurück, der durch Multiplizieren der durch N1 angegebenen Zahl mit der durch N2 angegebenen Zahl erhalten wird.
sign(N) Angegeben durch N und positiv als numerisches Vorzeichen(+1),Null(0),Negativ(-1)Gibt einen von zurück.
sqrt(N) Gibt den quadratischen Wert der durch N angegebenen Zahl zurück.
square(N) Gibt das Quadrat der durch N angegebenen Zahl zurück.
ceil(N) Gibt den Wert zurück, der von der durch N angegebenen Zahl aufgerundet wurde.
floor(N) Gibt den Wert mit der durch N abgeschnittenen Zahl zurück.
pi Gibt einen konstanten Wert von π als Gleitkommawert zurück.

String-Funktion

Funktionsname                     Erläuterung
replicate(S, N) Gibt die durch S angegebene Zeichenfolge zurück und wiederholt die von N angegebene Anzahl von Malen.
charindex(S1, S2[, N]) Gibt die Startposition der durch S2 angegebenen Zeichenfolge von der durch S1 angegebenen Zeichenfolge zurück. Wenn N angegeben ist, ist dies die Position, an der die Suche gestartet werden soll.
leftstr(S, N) Gibt die Zeichenfolge vom Anfang der durch S angegebenen Zeichenfolge mit der durch N angegebenen Zahl zurück.
rightstr(S, N) Gibt die Zeichenfolge vom Ende der durch S angegebenen Zeichenfolge mit der durch N angegebenen Zahl zurück.
reverse(S) Invertiert und gibt die von S angegebene Zeichenfolge zurück.
proper(S) Gibt nur den Anfang jedes Wortes in der durch S angegebenen Zeichenfolge zurück, konvertiert in Großbuchstaben und die anderen in Kleinbuchstaben.
padl(S, N) Gibt die Zeichenfolge mit N zusätzlichen Leerzeichen vor dem Beginn der durch S angegebenen Zeichenfolge zurück.
padr(S, N) Gibt die Zeichenfolge zurück, indem am Ende der durch S angegebenen Zeichenfolge N Leerzeichen hinzugefügt werden.
padc(S, N) Gibt die Zeichenfolge zurück und fügt N Leerzeichen vor und nach dem Anfang und Ende der durch S angegebenen Zeichenfolge hinzu.
strfilter(S1, S2) Gibt nur die Zeichen in der in S1 angegebenen Zeichenfolge zurück, die in der in S2 angegebenen Zeichenfolge vorhanden sind.

Aggregatfunktion

Funktionsname                     Erläuterung
stdev(N) Die Standardabweichung wird berechnet und aus allen durch N angegebenen numerischen Werten zurückgegeben.
variance(N) Durch N angegeben, findet und gibt die Varianz aller Zahlen zurück.
mode(N) Der häufigste Wert wird berechnet und aus allen durch N angegebenen numerischen Werten zurückgegeben.
median(N) Der Medianwert wird berechnet und aus allen durch N angegebenen numerischen Werten zurückgegeben.
lower_quartile(N) Findet den unteren Quadranten und gibt ihn aus allen durch N angegebenen Zahlen zurück.
upper_quartile(N) Findet den oberen Quadranten und gibt ihn aus allen durch N angegebenen Zahlen zurück.

Referenz

Ich bezog mich auf die folgenden Informationen.

Recommended Posts

Fügen Sie mit SQLite3 nur zwei Zeilen hinzu und verwenden Sie die Erweiterungsbibliothek (erweiterte SQL-Funktion)!
Verwenden Sie die LibreOffice-App in Python (3) Bibliothek hinzufügen
Wir haben den Python-Proxy, der Proxy in nur 200 Zeilen ausführt, erweitert, um die Zugriffsverweigerung hinzuzufügen.
[VueSlsApp] Geben Sie PYTHONPATH in Lambda an und verwenden Sie einfach die externe Bibliothek
Stellen Sie das in Python unter SQL Server erstellte Vorhersagemodell bereit und verwenden Sie es
Fügen Sie dem Bild Linien und Text hinzu
Verwendung der C-Bibliothek in Python
Verwenden Sie die LIKE-Klausel mit golang x SQLite3
[C / C ++] Übergeben Sie den in C / C ++ berechneten Wert an eine Python-Funktion, um den Prozess auszuführen, und verwenden Sie diesen Wert in C / C ++.