{"id":5755,"date":"2023-07-10T08:23:15","date_gmt":"2023-07-10T06:23:15","guid":{"rendered":"https:\/\/arduino.net.pl\/?p=5755"},"modified":"2023-08-14T19:03:44","modified_gmt":"2023-08-14T17:03:44","slug":"flask-i-biblioteka-sqlite3","status":"publish","type":"post","link":"https:\/\/arduino.net.pl\/index.php\/flask-i-biblioteka-sqlite3\/","title":{"rendered":"Flask i biblioteka sqlite3"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Jak stworzy\u0107 baz\u0119 danych SQLite oraz jak korzysta\u0107 z niej w Pythonie?<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Stworzenie bazy danych SQLite w terminalu:<\/strong> Aby stworzy\u0107 baz\u0119 danych SQLite, potrzebujesz uruchomi\u0107 polecenie <code>sqlite3<\/code> w terminalu. Wykonaj nast\u0119puj\u0105ce kroki: Otw\u00f3rz Terminal i wpisz:<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; light: false; title: Kod:; toolbar: true; notranslate\" title=\"Kod:\">\n   sqlite3 mydatabase.db\n<\/pre><\/div>\n\n\n<p>Gdzie <code>mydatabase.db<\/code> to nazwa pliku, w kt\u00f3rym chcesz przechowywa\u0107 baz\u0119 danych. Je\u015bli ten plik nie istnieje, SQLite stworzy go dla Ciebie.<\/p>\n\n\n\n<p>Po wprowadzeniu tego polecenia, powiniene\u015b zobaczy\u0107 znak zach\u0119ty <code>sqlite&gt;<\/code> oznaczaj\u0105cy, \u017ce jeste\u015b w trybie interaktywnej konsoli SQLite.<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><strong>Stworzenie tabeli:<\/strong> W trybie interaktywnej konsoli SQLite mo\u017cesz stworzy\u0107 tabel\u0119 za pomoc\u0105 polecenia <code>CREATE TABLE<\/code>. Przyk\u0142ad tworzenia tabeli &#8222;users&#8221; z kolumnami &#8222;id&#8221; i &#8222;name&#8221;:<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; light: false; title: Kod:; toolbar: true; notranslate\" title=\"Kod:\">\n   CREATE TABLE users (\n       id INTEGER PRIMARY KEY,\n       name TEXT\n   );\n<\/pre><\/div>\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li><strong>Zamkni\u0119cie konsoli SQLite:<\/strong> Aby zako\u0144czy\u0107 prac\u0119 w konsoli SQLite, wprowad\u017a <code>.exit<\/code> lub naci\u015bnij klawisze <code>Ctrl<\/code> + <code>D<\/code>.<\/li>\n\n\n\n<li><strong>Korzystanie z bazy danych w Pythonie:<\/strong> Po utworzeniu bazy danych SQLite, mo\u017cesz korzysta\u0107 z niej w swoim kodzie Pythona. Oto przyk\u0142ad, jak otworzy\u0107 po\u0142\u0105czenie do tej bazy w kodzie i wykona\u0107 zapytanie:<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; light: false; title: Kod:; toolbar: true; notranslate\" title=\"Kod:\">\n   import sqlite3\n\n   # Otwarcie po\u0142\u0105czenia do bazy danych\n   connection = sqlite3.connect(&#039;mydatabase.db&#039;)\n   cursor = connection.cursor()\n\n   # Przyk\u0142adowe zapytanie\n   cursor.execute(&quot;SELECT * FROM users&quot;)\n   rows = cursor.fetchall()\n\n   # Wy\u015bwietlenie wynik\u00f3w zapytania\n   for row in rows:\n       print(row)\n\n   # Zamkni\u0119cie po\u0142\u0105czenia\n   connection.close()\n<\/pre><\/div>\n\n\n<p>Upewnij si\u0119, \u017ce Tw\u00f3j skrypt Pythona znajduje si\u0119 w tym samym katalogu, w kt\u00f3rym znajduje si\u0119 plik bazy danych &#8222;mydatabase.db&#8221;. Je\u015bli chcesz u\u017cy\u0107 innego katalogu, podaj pe\u0142n\u0105 \u015bcie\u017ck\u0119 do pliku przy otwieraniu po\u0142\u0105czenia.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Bardziej szczeg\u00f3\u0142owy opis jak u\u017cywa\u0107 w Flasku biblioteki SQLite3:<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Importuj bibliotek\u0119 SQLite3:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>import sqlite3<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Utw\u00f3rz po\u0142\u0105czenie z baz\u0105 danych:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>conn = sqlite3.connect('baza.db')<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Utw\u00f3rz kursor:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>c = conn.cursor()<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>Wykonaj zapytanie SQL:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>c.execute(\"CREATE TABLE czujnik (temp REAL, hum REAL, bat REAL)\")<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>Zatwierd\u017a zmiany w bazie danych:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>conn.commit()<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"6\">\n<li>Zamknij po\u0142\u0105czenie z baz\u0105 danych:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>conn.close()<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Oto kilka najwa\u017cniejszych zapyta\u0144 SQL, kt\u00f3rych mo\u017cna u\u017cy\u0107 przy obs\u0142udze bazy SQLite3 w Flasku:<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Tworzenie tabeli:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>c.execute(\"CREATE TABLE nazwa_tabeli (kolumna1 typ_danych1, kolumna2 typ_danych2, ...)\")<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Dodawanie danych do tabeli:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>c.execute(\"INSERT INTO nazwa_tabeli (kolumna1, kolumna2, ...) VALUES (wartosc1, wartosc2, ...)\")<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Wy\u015bwietlanie wszystkich rekord\u00f3w z tabeli:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>c.execute(\"SELECT * FROM nazwa_tabeli\")<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>Wy\u015bwietlanie wybranych kolumn z tabeli:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>c.execute(\"SELECT kolumna1, kolumna2 FROM nazwa_tabeli\")<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li>Aktualizowanie danych w tabeli:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>c.execute(\"UPDATE nazwa_tabeli SET kolumna1 = nowa_wartosc WHERE warunek\")<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"6\">\n<li>Usuwanie danych z tabeli:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>c.execute(\"DELETE FROM nazwa_tabeli WHERE warunek\")<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">INDEKSOWANIE w SQLite3<\/h1>\n\n\n\n<p>Oto funkcja kt\u00f3ra kreuje baz\u0119 i tworzy tabel\u0119 oraz dwa indeksy:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DATABASE = 'mydatabase.db'\n\ndef create_table():\n    conn = sqlite3.connect(DATABASE)\n    cursor = conn.cursor()\n    cursor.execute('''\n        CREATE TABLE IF NOT EXISTS sensor_data (\n            id INTEGER PRIMARY KEY AUTOINCREMENT,\n            device_name TEXT NOT NULL,\n            data TEXT NOT NULL,\n            timestamp DATETIME DEFAULT CURRENT_TIMESTAMP\n        )\n    ''')\n    cursor.execute('''\n        CREATE INDEX IF NOT EXISTS idx_device_name ON sensor_data (device_name);\n    ''')\n    cursor.execute('''\n        CREATE INDEX IF NOT EXISTS idx_timestamp ON sensor_data (timestamp);\n    ''')\n    conn.commit()\n    conn.close()<\/code><\/pre>\n\n\n\n<p>Funkcja <code>create_table()<\/code> jest przeznaczona do tworzenia tabeli w bazie danych SQLite. Oto jej dzia\u0142anie krok po kroku:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Otwieranie po\u0142\u0105czenia z baz\u0105 danych:<\/strong><br>Funkcja rozpoczyna od otwarcia po\u0142\u0105czenia z baz\u0105 danych. Warto\u015b\u0107 <code>DATABASE<\/code> to prawdopodobnie zmienna zawieraj\u0105ca nazw\u0119 pliku bazy danych lub \u015bcie\u017ck\u0119 do tego pliku. Polecenie <code>sqlite3.connect(DATABASE)<\/code> tworzy po\u0142\u0105czenie z baz\u0105 danych.<\/li>\n\n\n\n<li><strong>Tworzenie kursora:<\/strong><br>Kursor to obiekt, kt\u00f3ry s\u0142u\u017cy do wykonywania polece\u0144 SQL w bazie danych. Tworzymy kursor za pomoc\u0105 <code>cursor = conn.cursor()<\/code>.<\/li>\n\n\n\n<li><strong>Tworzenie tabeli <code>sensor_data<\/code>:<\/strong><br>Funkcja wykonuje polecenie <code>CREATE TABLE IF NOT EXISTS<\/code>, kt\u00f3re tworzy tabel\u0119 <code>sensor_data<\/code>, je\u015bli taka tabela jeszcze nie istnieje. Tabela ma nast\u0119puj\u0105ce kolumny:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>id<\/code> &#8211; Unikalny identyfikator (klucz g\u0142\u00f3wny), kt\u00f3ry jest automatycznie generowany (AUTOINCREMENT).<\/li>\n\n\n\n<li><code>device_name<\/code> &#8211; Tekstowa kolumna przechowuj\u0105ca nazw\u0119 urz\u0105dzenia.<\/li>\n\n\n\n<li><code>data<\/code> &#8211; Tekstowa kolumna przechowuj\u0105ca dane z urz\u0105dzenia.<\/li>\n\n\n\n<li><code>timestamp<\/code> &#8211; Data i czas, kiedy dane zosta\u0142y dodane. Ma domy\u015bln\u0105 warto\u015b\u0107 <code>CURRENT_TIMESTAMP<\/code>, co oznacza, \u017ce automatycznie zostanie wype\u0142niona dat\u0105 i czasem w momencie dodawania rekordu.<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Tworzenie indeks\u00f3w:<\/strong><br>Funkcja nast\u0119pnie tworzy dwa indeksy na tabeli <code>sensor_data<\/code>, aby przyspieszy\u0107 zapytania wyszukuj\u0105ce. Indeksy s\u0105 tworzone przy u\u017cyciu polecenia <code>CREATE INDEX IF NOT EXISTS<\/code>.<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>idx_device_name<\/code> &#8211; Indeks na kolumnie <code>device_name<\/code>, co pozwala na szybkie wyszukiwanie danych na podstawie nazwy urz\u0105dzenia.<\/li>\n\n\n\n<li><code>idx_timestamp<\/code> &#8211; Indeks na kolumnie <code>timestamp<\/code>, co umo\u017cliwia szybkie sortowanie i wyszukiwanie danych wed\u0142ug czasu.<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Commit i zamkni\u0119cie po\u0142\u0105czenia:<\/strong><br>Po wykonaniu polece\u0144 SQL, funkcja wywo\u0142uje <code>conn.commit()<\/code>, aby zatwierdzi\u0107 wprowadzone zmiany w bazie danych, a nast\u0119pnie zamyka po\u0142\u0105czenie z baz\u0105 danych za pomoc\u0105 <code>conn.close()<\/code>.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">U\u017cywanie indeks\u00f3w<\/h2>\n\n\n\n<p>Aby u\u017cywa\u0107 indeks\u00f3w w swojej bazie danych SQLite, musisz najpierw utworzy\u0107 indeksy na odpowiednich kolumnach. Wcze\u015bniejsza odpowied\u017a zawiera\u0142a przyk\u0142ad tworzenia indeks\u00f3w w funkcji <code>create_table()<\/code>. Teraz przedstawimy bardziej szczeg\u00f3\u0142owe informacje na ten temat:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Tworzenie indeks\u00f3w:<\/strong><br>Indeksy s\u0105 tworzone przy u\u017cyciu polecenia <code>CREATE INDEX<\/code>. Mo\u017cesz doda\u0107 indeks do odpowiednich kolumn w istniej\u0105cej tabeli. Oto og\u00f3lna sk\u0142adnia:<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; light: false; title: Kod:; toolbar: true; notranslate\" title=\"Kod:\">\n   CREATE INDEX nazwa_indeksu ON nazwa_tabeli (kolumna1, kolumna2, ...);\n<\/pre><\/div>\n\n\n<p>Na przyk\u0142ad, aby doda\u0107 indeks na kolumnie &#8222;device_name&#8221; w tabeli &#8222;sensor_data&#8221;, wpisz:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; light: false; title: Kod:; toolbar: true; notranslate\" title=\"Kod:\">\n   CREATE INDEX idx_device_name ON sensor_data (device_name);\n<\/pre><\/div>\n\n\n<p>Indeksy mog\u0105 by\u0107 tworzone zar\u00f3wno podczas tworzenia tabeli, jak i po jej utworzeniu.<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><strong>Usuwanie indeks\u00f3w:<\/strong><br>Je\u015bli z jakiego\u015b powodu chcesz usun\u0105\u0107 indeks, mo\u017cesz u\u017cy\u0107 polecenia <code>DROP INDEX<\/code>. Oto jak to zrobi\u0107:<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; light: false; title: Kod:; toolbar: true; notranslate\" title=\"Kod:\">\n   DROP INDEX nazwa_indeksu;\n<\/pre><\/div>\n\n\n<p>Na przyk\u0142ad, aby usun\u0105\u0107 indeks &#8222;idx_device_name&#8221;, wpisz:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; light: false; title: Kod:; toolbar: true; notranslate\" title=\"Kod:\">\n   DROP INDEX idx_device_name;\n<\/pre><\/div>\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li><strong>U\u017cywanie indeks\u00f3w w zapytaniach:<\/strong><br>Indeksy s\u0105 u\u017cywane automatycznie przez baz\u0119 danych w zapytaniach, kt\u00f3re mog\u0105 skorzysta\u0107 z indeksu, aby przyspieszy\u0107 operacje wyszukiwania, sortowania, \u0142\u0105czenia i inne. Nie musisz niczego specjalnego robi\u0107 w zapytaniach, aby korzysta\u0107 z indeks\u00f3w, o ile twoje zapytania s\u0105 zgodne z indeksowanymi kolumnami. Jednak wa\u017cne jest, aby wybiera\u0107 w\u0142a\u015bciwe kolumny do indeksowania i zachowa\u0107 umiar, aby nie tworzy\u0107 nadmiernie du\u017co indeks\u00f3w, kt\u00f3re mog\u0105 wp\u0142yn\u0105\u0107 na wydajno\u015b\u0107 zapisu i og\u00f3lnej wydajno\u015bci bazy danych.<\/li>\n\n\n\n<li><strong>Analiza wydajno\u015bci:<\/strong><br>Mo\u017cesz u\u017cy\u0107 narz\u0119dzi analitycznych, takich jak polecenie <code>EXPLAIN QUERY PLAN<\/code>, aby zrozumie\u0107, jakie indeksy s\u0105 u\u017cywane przez bazy danych w konkretnych zapytaniach i jakie operacje s\u0105 wykonywane.<\/li>\n<\/ol>\n\n\n\n<p>Podsumowuj\u0105c, u\u017cywanie indeks\u00f3w w bazie danych SQLite polega na tworzeniu indeks\u00f3w na odpowiednich kolumnach tabeli. Baza danych automatycznie wykorzystuje indeksy w operacjach zapyta\u0144, kt\u00f3re s\u0105 zgodne z indeksowanymi kolumnami, aby poprawi\u0107 wydajno\u015b\u0107 operacji.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jak stworzy\u0107 baz\u0119 danych SQLite oraz jak korzysta\u0107 z niej w Pythonie? Gdzie mydatabase.db to nazwa pliku, w kt\u00f3rym chcesz przechowywa\u0107 baz\u0119 danych. Je\u015bli ten plik nie istnieje, SQLite stworzy&#8230;<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[59],"tags":[154,165,166,30],"class_list":["post-5755","post","type-post","status-publish","format-standard","hentry","category-python","tag-flask","tag-sql","tag-sqlite3","tag-tutorial"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts\/5755","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/comments?post=5755"}],"version-history":[{"count":13,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts\/5755\/revisions"}],"predecessor-version":[{"id":5832,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts\/5755\/revisions\/5832"}],"wp:attachment":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/media?parent=5755"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/categories?post=5755"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/tags?post=5755"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}