From 1b2d5475beb76dffd2d9fbf49694d0d2bd1f046a Mon Sep 17 00:00:00 2001 From: Petr Messner Date: Fri, 6 Mar 2020 14:53:11 +0100 Subject: [PATCH 1/9] pydata databaze - upravy pri hodine --- lessons/pydata/databases/index.ipynb | 772 +++++++++++++++++++++++++-- 1 file changed, 713 insertions(+), 59 deletions(-) diff --git a/lessons/pydata/databases/index.ipynb b/lessons/pydata/databases/index.ipynb index 89805fa8aa..a888a8abf7 100644 --- a/lessons/pydata/databases/index.ipynb +++ b/lessons/pydata/databases/index.ipynb @@ -115,11 +115,11 @@ "\n", "Co když chceme vyjádřit možnost, že jeden film může mít více než jednoho režiséra?\n", "\n", - "| movie_id | title | year | director_id |\n", - "|----------|:----------------------|:-----|:------------|\n", - "| 1 | Pelíšky | 1999 | 1 |\n", - "| 2 | Forrest Gump | 1994 | 2 |\n", - "| 3 | Návrat do budoucnosti | 1985 | 2 |\n", + "| movie_id | title | year |\n", + "|----------|:----------------------|:-----|\n", + "| 1 | Pelíšky | 1999 |\n", + "| 2 | Forrest Gump | 1994 |\n", + "| 3 | Návrat do budoucnosti | 1985 |\n", "\n", "| director_id | name | birthdate |\n", "|-------------|:----------------|------------|\n", @@ -411,7 +411,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 10, @@ -505,18 +505,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "1 Tim Robbins\n", - "2 Morgan Freeman\n", - "3 Bob Gunton\n", - "4 William Sadler\n", - "5 Clancy Brown\n" + "https://www.csfd.cz/tvurce/103-tim-robbins/ Tim Robbins\n", + "https://www.csfd.cz/tvurce/92-morgan-freeman/ Morgan Freeman\n", + "https://www.csfd.cz/tvurce/202-bob-gunton/ Bob Gunton\n", + "https://www.csfd.cz/tvurce/203-william-sadler/ William Sadler\n", + "https://www.csfd.cz/tvurce/204-clancy-brown/ Clancy Brown\n" ] } ], "source": [ - "result = engine.execute('SELECT id, name, csfd_url FROM actors LIMIT 5')\n", + "result = engine.execute('SELECT name, id, csfd_url FROM actors LIMIT 5')\n", "for row in result:\n", - " print(row[0], row[1])" + " print(row[2], row[0])" ] }, { @@ -528,18 +528,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "1 Tim Robbins\n", - "2 Morgan Freeman\n", - "3 Bob Gunton\n", - "4 William Sadler\n", - "5 Clancy Brown\n" + "(1, 'https://www.csfd.cz/tvurce/103-tim-robbins/', 'Tim Robbins', '1958-10-16')\n", + "(2, 'https://www.csfd.cz/tvurce/92-morgan-freeman/', 'Morgan Freeman', '1937-06-01')\n", + "(3, 'https://www.csfd.cz/tvurce/202-bob-gunton/', 'Bob Gunton', '1945-11-15')\n", + "(4, 'https://www.csfd.cz/tvurce/203-william-sadler/', 'William Sadler', '1950-04-13')\n", + "(5, 'https://www.csfd.cz/tvurce/204-clancy-brown/', 'Clancy Brown', '1959-01-05')\n" ] } ], "source": [ - "result = engine.execute('SELECT id, name, csfd_url FROM actors LIMIT 5')\n", + "result = engine.execute('SELECT * FROM actors LIMIT 5')\n", "for row in result:\n", - " print(row['id'], row['name'])" + " print(row)" ] }, { @@ -551,18 +551,34 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'id': 1, 'name': 'Tim Robbins', 'csfd_url': 'https://www.csfd.cz/tvurce/103-tim-robbins/'}\n", - "{'id': 2, 'name': 'Morgan Freeman', 'csfd_url': 'https://www.csfd.cz/tvurce/92-morgan-freeman/'}\n", - "{'id': 3, 'name': 'Bob Gunton', 'csfd_url': 'https://www.csfd.cz/tvurce/202-bob-gunton/'}\n", - "{'id': 4, 'name': 'William Sadler', 'csfd_url': 'https://www.csfd.cz/tvurce/203-william-sadler/'}\n", - "{'id': 5, 'name': 'Clancy Brown', 'csfd_url': 'https://www.csfd.cz/tvurce/204-clancy-brown/'}\n" + "{'birth_date': '1958-10-16',\n", + " 'csfd_url': 'https://www.csfd.cz/tvurce/103-tim-robbins/',\n", + " 'id': 1,\n", + " 'name': 'Tim Robbins'}\n", + "{'birth_date': '1937-06-01',\n", + " 'csfd_url': 'https://www.csfd.cz/tvurce/92-morgan-freeman/',\n", + " 'id': 2,\n", + " 'name': 'Morgan Freeman'}\n", + "{'birth_date': '1945-11-15',\n", + " 'csfd_url': 'https://www.csfd.cz/tvurce/202-bob-gunton/',\n", + " 'id': 3,\n", + " 'name': 'Bob Gunton'}\n", + "{'birth_date': '1950-04-13',\n", + " 'csfd_url': 'https://www.csfd.cz/tvurce/203-william-sadler/',\n", + " 'id': 4,\n", + " 'name': 'William Sadler'}\n", + "{'birth_date': '1959-01-05',\n", + " 'csfd_url': 'https://www.csfd.cz/tvurce/204-clancy-brown/',\n", + " 'id': 5,\n", + " 'name': 'Clancy Brown'}\n" ] } ], "source": [ - "result = engine.execute('SELECT id, name, csfd_url FROM actors LIMIT 5')\n", + "from pprint import pprint\n", + "result = engine.execute('SELECT * FROM actors LIMIT 5')\n", "for row in result:\n", - " print(dict(row))" + " pprint(dict(row))" ] }, { @@ -629,46 +645,122 @@ " \n", " \n", " id\n", + " csfd_url\n", " name\n", + " birth_date\n", " \n", " \n", " \n", " \n", " 0\n", " 1\n", + " https://www.csfd.cz/tvurce/103-tim-robbins/\n", " Tim Robbins\n", + " 1958-10-16\n", " \n", " \n", " 1\n", " 2\n", + " https://www.csfd.cz/tvurce/92-morgan-freeman/\n", " Morgan Freeman\n", + " 1937-06-01\n", " \n", " \n", " 2\n", " 3\n", + " https://www.csfd.cz/tvurce/202-bob-gunton/\n", " Bob Gunton\n", + " 1945-11-15\n", " \n", " \n", " 3\n", " 4\n", + " https://www.csfd.cz/tvurce/203-william-sadler/\n", " William Sadler\n", + " 1950-04-13\n", " \n", " \n", " 4\n", " 5\n", + " https://www.csfd.cz/tvurce/204-clancy-brown/\n", " Clancy Brown\n", + " 1959-01-05\n", + " \n", + " \n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " \n", + " \n", + " 7522\n", + " 7523\n", + " https://www.csfd.cz/tvurce/147104-jon-kenny/\n", + " Jon Kenny\n", + " None\n", + " \n", + " \n", + " 7523\n", + " 7524\n", + " https://www.csfd.cz/tvurce/147105-lisa-hannigan/\n", + " Lisa Hannigan\n", + " 1981-02-12\n", + " \n", + " \n", + " 7524\n", + " 7525\n", + " https://www.csfd.cz/tvurce/162204-lucy-o-connell/\n", + " Lucy O'Connell\n", + " None\n", + " \n", + " \n", + " 7525\n", + " 7526\n", + " https://www.csfd.cz/tvurce/309228-paul-young/\n", + " Paul Young\n", + " None\n", + " \n", + " \n", + " 7526\n", + " 7527\n", + " https://www.csfd.cz/tvurce/458624-grethe-mogen...\n", + " Grethe Mogensen\n", + " 1937-05-25\n", " \n", " \n", "\n", + "

7527 rows × 4 columns

\n", "" ], "text/plain": [ - " id name\n", - "0 1 Tim Robbins\n", - "1 2 Morgan Freeman\n", - "2 3 Bob Gunton\n", - "3 4 William Sadler\n", - "4 5 Clancy Brown" + " id csfd_url \\\n", + "0 1 https://www.csfd.cz/tvurce/103-tim-robbins/ \n", + "1 2 https://www.csfd.cz/tvurce/92-morgan-freeman/ \n", + "2 3 https://www.csfd.cz/tvurce/202-bob-gunton/ \n", + "3 4 https://www.csfd.cz/tvurce/203-william-sadler/ \n", + "4 5 https://www.csfd.cz/tvurce/204-clancy-brown/ \n", + "... ... ... \n", + "7522 7523 https://www.csfd.cz/tvurce/147104-jon-kenny/ \n", + "7523 7524 https://www.csfd.cz/tvurce/147105-lisa-hannigan/ \n", + "7524 7525 https://www.csfd.cz/tvurce/162204-lucy-o-connell/ \n", + "7525 7526 https://www.csfd.cz/tvurce/309228-paul-young/ \n", + "7526 7527 https://www.csfd.cz/tvurce/458624-grethe-mogen... \n", + "\n", + " name birth_date \n", + "0 Tim Robbins 1958-10-16 \n", + "1 Morgan Freeman 1937-06-01 \n", + "2 Bob Gunton 1945-11-15 \n", + "3 William Sadler 1950-04-13 \n", + "4 Clancy Brown 1959-01-05 \n", + "... ... ... \n", + "7522 Jon Kenny None \n", + "7523 Lisa Hannigan 1981-02-12 \n", + "7524 Lucy O'Connell None \n", + "7525 Paul Young None \n", + "7526 Grethe Mogensen 1937-05-25 \n", + "\n", + "[7527 rows x 4 columns]" ] }, "execution_count": 17, @@ -677,7 +769,7 @@ } ], "source": [ - "pd.read_sql_query('SELECT id, name FROM actors LIMIT 5', engine)" + "pd.read_sql_query('SELECT * FROM actors', engine)" ] }, { @@ -1193,7 +1285,10 @@ } ], "source": [ - "list(engine.execute('SELECT * FROM actors WHERE birth_date > \"2000-01-01\" AND birth_date < \"2001-01-01\"'))" + "list(engine.execute('''\n", + " SELECT * FROM actors \n", + " WHERE birth_date > \"2000-01-01\" AND birth_date < \"2001-01-01\"\n", + "'''))" ] }, { @@ -1303,13 +1398,18 @@ } ], "source": [ - "list(engine.execute('SELECT * FROM actors WHERE birth_date > \"2005-01-01\" ORDER BY birth_date ASC'))" + "list(engine.execute('''\n", + " SELECT * FROM actors \n", + " WHERE birth_date > \"2005-01-01\" \n", + " ORDER BY birth_date ASC'''))" ] }, { "cell_type": "code", "execution_count": 27, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { @@ -1400,7 +1500,214 @@ } ], "source": [ - "actors[(actors['birth_date'] > '2005-01-01')].sort_values('birth_date')" + "actors[(actors['birth_date'] > '2005-01-01')].sort_values('name').sort_values('birth_date')" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleyearrating
0Dvanáct rozhněvaných mužů195791.3
1Tenkrát na Západě196890.6
2Kmotr197291.8
3Kmotr II197490.8
4Přelet nad kukaččím hnízdem197592.5
5Terminátor 2: Den zúčtování199190.8
6Mlčení jehňátek199190.5
7Schindlerův seznam199392.3
8Vykoupení z věznice Shawshank199495.3
9Pulp Fiction: Historky z podsvětí199490.7
10Forrest Gump199494.5
11Sedm199592.4
12Zelená míle199992.8
13Pelíšky199991.2
14Matrix199990.1
15Pán prstenů: Společenstvo Prstenu200190.4
16Pán prstenů: Návrat krále200390.3
17Temný rytíř200890.2
18Gran Torino200890.3
19Nedotknutelní201191.3
20Le Mans '66201990.5
21Gentlemani201990.4
\n", + "
" + ], + "text/plain": [ + " title year rating\n", + "0 Dvanáct rozhněvaných mužů 1957 91.3\n", + "1 Tenkrát na Západě 1968 90.6\n", + "2 Kmotr 1972 91.8\n", + "3 Kmotr II 1974 90.8\n", + "4 Přelet nad kukaččím hnízdem 1975 92.5\n", + "5 Terminátor 2: Den zúčtování 1991 90.8\n", + "6 Mlčení jehňátek 1991 90.5\n", + "7 Schindlerův seznam 1993 92.3\n", + "8 Vykoupení z věznice Shawshank 1994 95.3\n", + "9 Pulp Fiction: Historky z podsvětí 1994 90.7\n", + "10 Forrest Gump 1994 94.5\n", + "11 Sedm 1995 92.4\n", + "12 Zelená míle 1999 92.8\n", + "13 Pelíšky 1999 91.2\n", + "14 Matrix 1999 90.1\n", + "15 Pán prstenů: Společenstvo Prstenu 2001 90.4\n", + "16 Pán prstenů: Návrat krále 2003 90.3\n", + "17 Temný rytíř 2008 90.2\n", + "18 Gran Torino 2008 90.3\n", + "19 Nedotknutelní 2011 91.3\n", + "20 Le Mans '66 2019 90.5\n", + "21 Gentlemani 2019 90.4" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.read_sql_query('''\n", + " SELECT title, year, rating FROM movies \n", + " WHERE rating > 90\n", + " ORDER BY year ASC, title DESC\n", + "''', engine)" ] }, { @@ -1412,40 +1719,204 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[(1957, 6),\n", - " (1968, 6),\n", - " (1973, 6),\n", - " (1980, 6),\n", - " (1984, 6),\n", - " (1986, 7),\n", - " (1990, 7),\n", - " (1991, 6),\n", - " (1993, 11),\n", - " (1995, 7),\n", - " (1997, 8),\n", - " (1998, 6),\n", + "[(1993, 11),\n", + " (2004, 9),\n", " (1999, 9),\n", - " (2000, 6),\n", " (2001, 8),\n", - " (2002, 6),\n", + " (1997, 8),\n", + " (1995, 7),\n", + " (1990, 7),\n", + " (1986, 7),\n", + " (2008, 6),\n", " (2003, 6),\n", - " (2004, 9),\n", - " (2008, 6)]" + " (2002, 6),\n", + " (2000, 6),\n", + " (1998, 6),\n", + " (1991, 6),\n", + " (1984, 6),\n", + " (1980, 6),\n", + " (1973, 6),\n", + " (1968, 6),\n", + " (1957, 6)]" ] }, - "execution_count": 28, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "list(engine.execute('SELECT year, COUNT(*) FROM movies GROUP BY year HAVING COUNT(*) > 5'))" + "list(engine.execute('''\n", + " SELECT year, COUNT(*) FROM movies GROUP BY year \n", + " HAVING COUNT(*) > 5 ORDER BY COUNT(*) DESC '''))" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearCOUNT(id)MIN(rating)AVG(rating)MAX(rating)
02004984.585.77777887.9
12001884.786.85000090.4
21999984.687.92222292.8
31997884.686.58750089.1
419931184.686.02727392.3
\n", + "
" + ], + "text/plain": [ + " year COUNT(id) MIN(rating) AVG(rating) MAX(rating)\n", + "0 2004 9 84.5 85.777778 87.9\n", + "1 2001 8 84.7 86.850000 90.4\n", + "2 1999 9 84.6 87.922222 92.8\n", + "3 1997 8 84.6 86.587500 89.1\n", + "4 1993 11 84.6 86.027273 92.3" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.read_sql_query('''\n", + " SELECT year, COUNT(id), MIN(rating), AVG(rating), MAX(rating) \n", + " FROM movies \n", + " WHERE rating > 10\n", + " GROUP BY year\n", + " HAVING COUNT(id) > 7\n", + " ORDER BY year DESC\n", + " ''', engine)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
COUNT(*)COUNT(id)COUNT(birth_date)
0752775275753
\n", + "
" + ], + "text/plain": [ + " COUNT(*) COUNT(id) COUNT(birth_date)\n", + "0 7527 7527 5753" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.read_sql_query('''\n", + " SELECT COUNT(*), COUNT(id), COUNT(birth_date) \n", + " FROM actors \n", + " ''', engine)" ] }, { @@ -1471,7 +1942,190 @@ "\n", "TODO: tady bude ukázka JOIN v SQL vs. merge v DataFrame\n", "\n", - "
" + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
movie_idtitleactor_idnameididecko_filmu
01Vykoupení z věznice Shawshank1Tim Robbins11
11Vykoupení z věznice Shawshank2Morgan Freeman21
25Sedm2Morgan Freeman25
320Temný rytíř2Morgan Freeman220
464Million Dollar Baby2Morgan Freeman264
.....................
9806300Píseň moře7523Jon Kenny7523300
9807300Píseň moře7524Lisa Hannigan7524300
9808300Píseň moře7525Lucy O'Connell7525300
9809300Píseň moře7526Paul Young7526300
9810300Píseň moře7527Grethe Mogensen7527300
\n", + "

9811 rows × 6 columns

\n", + "
" + ], + "text/plain": [ + " movie_id title actor_id name \\\n", + "0 1 Vykoupení z věznice Shawshank 1 Tim Robbins \n", + "1 1 Vykoupení z věznice Shawshank 2 Morgan Freeman \n", + "2 5 Sedm 2 Morgan Freeman \n", + "3 20 Temný rytíř 2 Morgan Freeman \n", + "4 64 Million Dollar Baby 2 Morgan Freeman \n", + "... ... ... ... ... \n", + "9806 300 Píseň moře 7523 Jon Kenny \n", + "9807 300 Píseň moře 7524 Lisa Hannigan \n", + "9808 300 Píseň moře 7525 Lucy O'Connell \n", + "9809 300 Píseň moře 7526 Paul Young \n", + "9810 300 Píseň moře 7527 Grethe Mogensen \n", + "\n", + " id idecko_filmu \n", + "0 1 1 \n", + "1 2 1 \n", + "2 2 5 \n", + "3 2 20 \n", + "4 2 64 \n", + "... ... ... \n", + "9806 7523 300 \n", + "9807 7524 300 \n", + "9808 7525 300 \n", + "9809 7526 300 \n", + "9810 7527 300 \n", + "\n", + "[9811 rows x 6 columns]" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.read_sql_query('''\n", + " SELECT movie_id, title, actor_id, name, a.id, m.id AS idecko_filmu\n", + " FROM actors AS a\n", + " LEFT JOIN movie_to_actor AS ma ON a.id = ma.actor_id\n", + " LEFT JOIN movies AS m ON m.id = ma.movie_id\n", + "''', engine)" ] }, { @@ -1535,7 +2189,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.6" } }, "nbformat": 4, From 98752a2dd36c14c5bff5d439c76384409bc69227 Mon Sep 17 00:00:00 2001 From: Petr Messner Date: Wed, 18 Mar 2020 13:38:43 +0100 Subject: [PATCH 2/9] zruseni zminky o security, nedavalo to moc smysl --- lessons/pydata/databases/index.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lessons/pydata/databases/index.ipynb b/lessons/pydata/databases/index.ipynb index a888a8abf7..10005651d1 100644 --- a/lessons/pydata/databases/index.ipynb +++ b/lessons/pydata/databases/index.ipynb @@ -55,7 +55,7 @@ "\n", "- Že bude uchovávat data :) Ne, vážně - data musí zůstat beze ztráty uložena i v případě výpadku napájení, když dojde místo na disku...\n", "- Práce s daty \"z různých úhlů\". Např. v e-shopu chceme jednou vypsat zboží podle kategorie, jindy podle stavu skladových zásob, jindy na základě full-textového vyhledávání..\n", - "- Podpora uživatelů, rolí, oprávnění a kontroly přístupu k datům, security.\n", + "- Podpora uživatelů, rolí, oprávnění a kontroly přístupu k datům.\n", "- Rychlost, výkon, propustnost, latence\n", "- Škálovatelnost - jak do velikosti (gigabajty, terabajty, petabajty), tak do počtu prováděných operací za sekundu\n", "- ACID\n", From fac33766d696410045df864eedc887a27ca3404a Mon Sep 17 00:00:00 2001 From: Petr Messner Date: Wed, 18 Mar 2020 13:48:43 +0100 Subject: [PATCH 3/9] doplneni obecneho popisu k databazim --- lessons/pydata/databases/index.ipynb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lessons/pydata/databases/index.ipynb b/lessons/pydata/databases/index.ipynb index 10005651d1..6afd2c5e19 100644 --- a/lessons/pydata/databases/index.ipynb +++ b/lessons/pydata/databases/index.ipynb @@ -53,16 +53,16 @@ "\n", "Od databáze (resp. databázového systému) očekáváme několik vlastností:\n", "\n", - "- Že bude uchovávat data :) Ne, vážně - data musí zůstat beze ztráty uložena i v případě výpadku napájení, když dojde místo na disku...\n", + "- Že bude uchovávat data :) Ne, vážně - data musí zůstat beze ztráty uložena i v případě výpadku napájení, když dojde místo na disku... Že existují nástroje pro zálohování a obnovu databáze.\n", "- Práce s daty \"z různých úhlů\". Např. v e-shopu chceme jednou vypsat zboží podle kategorie, jindy podle stavu skladových zásob, jindy na základě full-textového vyhledávání..\n", "- Podpora uživatelů, rolí, oprávnění a kontroly přístupu k datům.\n", - "- Rychlost, výkon, propustnost, latence\n", + "- Rychlost, výkon, propustnost, nízká latence\n", "- Škálovatelnost - jak do velikosti (gigabajty, terabajty, petabajty), tak do počtu prováděných operací za sekundu\n", "- ACID\n", - " - Atomicity:\n", - " - Consistency:\n", - " - Isolation:\n", - " - Durability:\n", + " - **Atomicity**: celá transakce (série několika databázových operací) se provede celá, nebo vůbec\n", + " - **Consistency**: nesmí být narušena integrita dat, tj. podmínek definových v databázovém schématu (např. unikátní hodnoty, reference řádků mezi tabulkami...)\n", + " - **Isolation**: vícero současně probíhajících transakcí se nesmí navzájem ovlivnit\n", + " - **Durability**: jakmile je transakce dokončena, je zaznamenána trvalým způsobem, nesmaže ji např. výpadek napájení\n", " \n", "Když se nad tím zamyslíte, jedná se o protichůdné požadavky. Tvůrci databázových systémů tak musí zvolit nějaký kompomis. Někdy lze databáze nakonfigurovat, zda má např. preferovat izolaci, nebo propustnost (viz [PostgreSQL Transaction Isolation](https://www.postgresql.org/docs/9.5/transaction-iso.html)). Žádná databáze není \"nejlepší\" a vhodná na všechno. Zrovna co se týče rozdílu mezi \"transakční\" a \"analytickou\" databází, tak často pro tyto oblasti jsou vhodné odlišné systémy a přístupy.\n", " " From 0d72ca4cd8d9afe3d1f41b44ecf98b6624af8860 Mon Sep 17 00:00:00 2001 From: Petr Messner Date: Wed, 18 Mar 2020 13:59:50 +0100 Subject: [PATCH 4/9] uprava prikladu okolo RowProxy --- lessons/pydata/databases/index.ipynb | 158 +++++++++++++++------------ 1 file changed, 90 insertions(+), 68 deletions(-) diff --git a/lessons/pydata/databases/index.ipynb b/lessons/pydata/databases/index.ipynb index 6afd2c5e19..e17f7622ed 100644 --- a/lessons/pydata/databases/index.ipynb +++ b/lessons/pydata/databases/index.ipynb @@ -411,7 +411,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 10, @@ -491,15 +491,45 @@ "source": [ "Jde o SQLAlchemy objekt RowProxy, který umí pár zajímavých věcí:\n", "\n", - "- vrátit hodnotu daného sloupce podle pořadí \n", - "- vrátit hodnotu daného sloupce podle názvu\n", - "- vrátit dict s hodnotami" + "- vrátit hodnotu daného sloupce podle pořadí – např. `row[2]`\n", + "- vrátit hodnotu daného sloupce podle názvu – např. `row[\"name\"]`\n", + "- vrátit dict s hodnotami – např. `dict(row)`" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 Tim Robbins\n", + "2 Morgan Freeman\n", + "3 Bob Gunton\n", + "4 William Sadler\n", + "5 Clancy Brown\n" + ] + } + ], + "source": [ + "result = engine.execute('SELECT id, name, csfd_url FROM actors LIMIT 5')\n", + "for row in result:\n", + " print(row[0], row[1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Poznámka: sloupce vyjmenované za `SELECT` mohou být v jakémkoli pořadí. Stejně tak vytahávat si je z toho `RowProxy` objektu také můžeme libovolně v jakémkoli pořadí. " + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -519,9 +549,16 @@ " print(row[2], row[0])" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pomocí `SELECT *` si vytáhneme všechny dostupné sloupce:" + ] + }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -542,55 +579,40 @@ " print(row)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Asi bude lepší místo `row[2]` používat např. `row[\"name\"]`,\n", + "nebo si to převést celé do slovníku přes `dict(row)`:" + ] + }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{'birth_date': '1958-10-16',\n", - " 'csfd_url': 'https://www.csfd.cz/tvurce/103-tim-robbins/',\n", - " 'id': 1,\n", - " 'name': 'Tim Robbins'}\n", - "{'birth_date': '1937-06-01',\n", - " 'csfd_url': 'https://www.csfd.cz/tvurce/92-morgan-freeman/',\n", - " 'id': 2,\n", - " 'name': 'Morgan Freeman'}\n", - "{'birth_date': '1945-11-15',\n", - " 'csfd_url': 'https://www.csfd.cz/tvurce/202-bob-gunton/',\n", - " 'id': 3,\n", - " 'name': 'Bob Gunton'}\n", - "{'birth_date': '1950-04-13',\n", - " 'csfd_url': 'https://www.csfd.cz/tvurce/203-william-sadler/',\n", - " 'id': 4,\n", - " 'name': 'William Sadler'}\n", - "{'birth_date': '1959-01-05',\n", - " 'csfd_url': 'https://www.csfd.cz/tvurce/204-clancy-brown/',\n", - " 'id': 5,\n", - " 'name': 'Clancy Brown'}\n" + "1 Tim Robbins 1958-10-16\n", + "2 Morgan Freeman 1937-06-01\n", + "3 Bob Gunton 1945-11-15\n", + "4 William Sadler 1950-04-13\n", + "5 Clancy Brown 1959-01-05\n" ] } ], "source": [ - "from pprint import pprint\n", "result = engine.execute('SELECT * FROM actors LIMIT 5')\n", "for row in result:\n", - " pprint(dict(row))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Pokud chceme získat hodnoty ze všech sloupečků, použijeme hvězdičku." + " print(row['id'], row['name'], row['birth_date'])" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -615,12 +637,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Z dat lze vytvořit i Pandas DataFrame:" + "Z dat lze vytvořit i **Pandas DataFrame**:" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -763,7 +785,7 @@ "[7527 rows x 4 columns]" ] }, - "execution_count": 17, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -781,7 +803,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -924,7 +946,7 @@ "[7527 rows x 4 columns]" ] }, - "execution_count": 18, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -946,7 +968,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -955,7 +977,7 @@ "['actors', 'movie_to_actor', 'movies']" ] }, - "execution_count": 19, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -966,7 +988,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -977,7 +999,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -1063,7 +1085,7 @@ "4 1959-01-05 " ] }, - "execution_count": 21, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -1074,7 +1096,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -1166,7 +1188,7 @@ "4 https://www.csfd.cz/film/2671-sedm/ 1995 92.4 " ] }, - "execution_count": 22, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -1177,7 +1199,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -1250,7 +1272,7 @@ "4 5 1 5" ] }, - "execution_count": 23, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -1268,7 +1290,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -1279,7 +1301,7 @@ " (6290, 'https://www.csfd.cz/tvurce/35296-morgan-lily/', 'Morgan Lily', '2000-04-11')]" ] }, - "execution_count": 24, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -1293,7 +1315,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -1361,7 +1383,7 @@ "6289 2000-04-11 " ] }, - "execution_count": 25, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -1379,7 +1401,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -1392,7 +1414,7 @@ " (1865, 'https://www.csfd.cz/tvurce/354371-pierce-pope/', 'Pierce Pope', '2008-06-02')]" ] }, - "execution_count": 26, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -1406,7 +1428,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "metadata": { "scrolled": true }, @@ -1494,7 +1516,7 @@ "1864 Pierce Pope 2008-06-02 " ] }, - "execution_count": 27, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -1505,7 +1527,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -1697,7 +1719,7 @@ "21 Gentlemani 2019 90.4" ] }, - "execution_count": 28, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -1719,7 +1741,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -1746,7 +1768,7 @@ " (1957, 6)]" ] }, - "execution_count": 29, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -1759,7 +1781,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -1844,7 +1866,7 @@ "4 1993 11 84.6 86.027273 92.3" ] }, - "execution_count": 30, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -1862,7 +1884,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -1907,7 +1929,7 @@ "0 7527 7527 5753" ] }, - "execution_count": 31, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -1947,7 +1969,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -2114,7 +2136,7 @@ "[9811 rows x 6 columns]" ] }, - "execution_count": 40, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } From e36ecec6426ed4e3dd71d62eaf794e9654b2d8c4 Mon Sep 17 00:00:00 2001 From: Petr Messner Date: Wed, 18 Mar 2020 14:09:45 +0100 Subject: [PATCH 5/9] WIP --- lessons/pydata/databases/index.ipynb | 264 +++++++++++++++------------ 1 file changed, 151 insertions(+), 113 deletions(-) diff --git a/lessons/pydata/databases/index.ipynb b/lessons/pydata/databases/index.ipynb index e17f7622ed..0994d8972b 100644 --- a/lessons/pydata/databases/index.ipynb +++ b/lessons/pydata/databases/index.ipynb @@ -1401,7 +1401,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 44, "metadata": {}, "outputs": [ { @@ -1414,7 +1414,7 @@ " (1865, 'https://www.csfd.cz/tvurce/354371-pierce-pope/', 'Pierce Pope', '2008-06-02')]" ] }, - "execution_count": 27, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -1428,7 +1428,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 45, "metadata": { "scrolled": true }, @@ -1516,18 +1516,25 @@ "1864 Pierce Pope 2008-06-02 " ] }, - "execution_count": 28, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "actors[(actors['birth_date'] > '2005-01-01')].sort_values('name').sort_values('birth_date')" + "actors[(actors['birth_date'] > '2005-01-01')].sort_values('birth_date')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Při řazení podle více sloupců pozor na pořadí :)" ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 49, "metadata": {}, "outputs": [ { @@ -1559,177 +1566,196 @@ " \n", " \n", " 0\n", - " Dvanáct rozhněvaných mužů\n", - " 1957\n", - " 91.3\n", + " Pán prstenů: Společenstvo Prstenu\n", + " 2001\n", + " 90.4\n", " \n", " \n", " 1\n", - " Tenkrát na Západě\n", - " 1968\n", - " 90.6\n", + " Pán prstenů: Návrat krále\n", + " 2003\n", + " 90.3\n", " \n", " \n", " 2\n", - " Kmotr\n", - " 1972\n", - " 91.8\n", + " Temný rytíř\n", + " 2008\n", + " 90.2\n", " \n", " \n", " 3\n", - " Kmotr II\n", - " 1974\n", - " 90.8\n", + " Gran Torino\n", + " 2008\n", + " 90.3\n", " \n", " \n", " 4\n", - " Přelet nad kukaččím hnízdem\n", - " 1975\n", - " 92.5\n", + " Nedotknutelní\n", + " 2011\n", + " 91.3\n", " \n", " \n", " 5\n", - " Terminátor 2: Den zúčtování\n", - " 1991\n", - " 90.8\n", - " \n", - " \n", - " 6\n", - " Mlčení jehňátek\n", - " 1991\n", + " Le Mans '66\n", + " 2019\n", " 90.5\n", " \n", " \n", - " 7\n", - " Schindlerův seznam\n", - " 1993\n", - " 92.3\n", - " \n", - " \n", - " 8\n", - " Vykoupení z věznice Shawshank\n", - " 1994\n", - " 95.3\n", - " \n", - " \n", - " 9\n", - " Pulp Fiction: Historky z podsvětí\n", - " 1994\n", - " 90.7\n", - " \n", - " \n", - " 10\n", - " Forrest Gump\n", - " 1994\n", - " 94.5\n", - " \n", - " \n", - " 11\n", - " Sedm\n", - " 1995\n", - " 92.4\n", - " \n", - " \n", - " 12\n", - " Zelená míle\n", - " 1999\n", - " 92.8\n", - " \n", - " \n", - " 13\n", - " Pelíšky\n", - " 1999\n", - " 91.2\n", + " 6\n", + " Gentlemani\n", + " 2019\n", + " 90.4\n", " \n", - " \n", - " 14\n", - " Matrix\n", - " 1999\n", - " 90.1\n", + " \n", + "\n", + "" + ], + "text/plain": [ + " title year rating\n", + "0 Pán prstenů: Společenstvo Prstenu 2001 90.4\n", + "1 Pán prstenů: Návrat krále 2003 90.3\n", + "2 Temný rytíř 2008 90.2\n", + "3 Gran Torino 2008 90.3\n", + "4 Nedotknutelní 2011 91.3\n", + "5 Le Mans '66 2019 90.5\n", + "6 Gentlemani 2019 90.4" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.read_sql_query('''\n", + " SELECT title, year, rating FROM movies \n", + " WHERE rating > 90 AND year >= 2000\n", + " ORDER BY year ASC, title DESC\n", + "''', engine)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " \n", + " \n", + " \n", " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", " \n", + " \n", " \n", " \n", " \n", " \n", " \n", + " \n", " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", + " \n", " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", + " \n", " \n", + " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
idtitlecsfd_urlyearrating
151617Pán prstenů: Společenstvo Prstenuhttps://www.csfd.cz/film/4711-pan-prstenu-spol...200190.4
161718Pán prstenů: Návrat králehttps://www.csfd.cz/film/4712-pan-prstenu-navr...200390.3
171920Temný rytířhttps://www.csfd.cz/film/223734-temny-rytir/200890.2
1819Gran Torinohttps://www.csfd.cz/film/240479-gran-torino/200890.3
1978Nedotknutelníhttps://www.csfd.cz/film/306731-nedotknutelni/201191.3
20Le Mans '66201990.5
2122Gentlemanihttps://www.csfd.cz/film/675173-gentlemani/201990.4
1516Le Mans '66https://www.csfd.cz/film/332773-le-mans-66/201990.5
\n", "
" ], "text/plain": [ - " title year rating\n", - "0 Dvanáct rozhněvaných mužů 1957 91.3\n", - "1 Tenkrát na Západě 1968 90.6\n", - "2 Kmotr 1972 91.8\n", - "3 Kmotr II 1974 90.8\n", - "4 Přelet nad kukaččím hnízdem 1975 92.5\n", - "5 Terminátor 2: Den zúčtování 1991 90.8\n", - "6 Mlčení jehňátek 1991 90.5\n", - "7 Schindlerův seznam 1993 92.3\n", - "8 Vykoupení z věznice Shawshank 1994 95.3\n", - "9 Pulp Fiction: Historky z podsvětí 1994 90.7\n", - "10 Forrest Gump 1994 94.5\n", - "11 Sedm 1995 92.4\n", - "12 Zelená míle 1999 92.8\n", - "13 Pelíšky 1999 91.2\n", - "14 Matrix 1999 90.1\n", - "15 Pán prstenů: Společenstvo Prstenu 2001 90.4\n", - "16 Pán prstenů: Návrat krále 2003 90.3\n", - "17 Temný rytíř 2008 90.2\n", - "18 Gran Torino 2008 90.3\n", - "19 Nedotknutelní 2011 91.3\n", - "20 Le Mans '66 2019 90.5\n", - "21 Gentlemani 2019 90.4" + " id title \\\n", + "16 17 Pán prstenů: Společenstvo Prstenu \n", + "17 18 Pán prstenů: Návrat krále \n", + "19 20 Temný rytíř \n", + "18 19 Gran Torino \n", + "7 8 Nedotknutelní \n", + "21 22 Gentlemani \n", + "15 16 Le Mans '66 \n", + "\n", + " csfd_url year rating \n", + "16 https://www.csfd.cz/film/4711-pan-prstenu-spol... 2001 90.4 \n", + "17 https://www.csfd.cz/film/4712-pan-prstenu-navr... 2003 90.3 \n", + "19 https://www.csfd.cz/film/223734-temny-rytir/ 2008 90.2 \n", + "18 https://www.csfd.cz/film/240479-gran-torino/ 2008 90.3 \n", + "7 https://www.csfd.cz/film/306731-nedotknutelni/ 2011 91.3 \n", + "21 https://www.csfd.cz/film/675173-gentlemani/ 2019 90.4 \n", + "15 https://www.csfd.cz/film/332773-le-mans-66/ 2019 90.5 " ] }, - "execution_count": 29, + "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "pd.read_sql_query('''\n", - " SELECT title, year, rating FROM movies \n", - " WHERE rating > 90\n", - " ORDER BY year ASC, title DESC\n", - "''', engine)" + "movies[(movies['rating'] > 90) & (movies['year'] >= 2000)] \\\n", + " .sort_values('rating').sort_values('year')" ] }, { @@ -1941,6 +1967,18 @@ " ''', engine)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Struktura SQL dotazu\n", + "\n", + "Probrali jsme jen to nejdůležitější. Pro představu, jaké jsou možnosti zápisu SELECT dotazu\n", + ":\n", + "\n", + "


" + ] + }, { "cell_type": "markdown", "metadata": {}, From ec52072e4c3e506447940305e028495fca1ddc74 Mon Sep 17 00:00:00 2001 From: Petr Messner Date: Wed, 18 Mar 2020 14:16:06 +0100 Subject: [PATCH 6/9] WIP --- lessons/pydata/databases/index.ipynb | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/lessons/pydata/databases/index.ipynb b/lessons/pydata/databases/index.ipynb index 0994d8972b..b085e65f91 100644 --- a/lessons/pydata/databases/index.ipynb +++ b/lessons/pydata/databases/index.ipynb @@ -1762,7 +1762,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## SELECT ... GROUP BY" + "## SELECT ... GROUP BY\n", + "\n", + "GROUP BY umožňuje \"shluknout\" řádky do *skupin*, a nad těmito skupinami pak provádět agregační funkce (MIN, MAX, AVG, COUNT apod.).\n", + "\n", + "Tyto skupiny pak lze dále filtrovat pomocí HAVING (podobně jako WHERE filtruje *řádky*, a to *předtím*, než se z nich vytvářejí ty *skupiny*)." ] }, { @@ -1973,8 +1977,18 @@ "source": [ "## Struktura SQL dotazu\n", "\n", + "Ještě rekapitulace, jak se probíhá provádění SQL dotazu :)\n", + "\n", + "1. databáze vezme tabulky vyjmenované ve FROM a JOIN\n", + "2. databáze čte řádky (jeden po druhém) z těch tabulek (už spojené podle příslušných JOIN výrazů)\n", + "3. ty řádky se filtrují podle uvedených WHERE výrazů\n", + "4. přefiltrované řádky se seskupí podle GROUP BY výrazů do skupin\n", + "5. ty skupiny se filtrují pode uvedených HAVING výrazů\n", + "6. to,\n", + "\n", + "\n", "Probrali jsme jen to nejdůležitější. Pro představu, jaké jsou možnosti zápisu SELECT dotazu\n", - ":\n", + "(převzato z [dokumentace SQLite](https://www.sqlite.org/lang_select.html)):\n", "\n", "


" ] From 65012ceb5712c2f1490d219abb1f45887dc9570c Mon Sep 17 00:00:00 2001 From: Petr Messner Date: Wed, 18 Mar 2020 14:27:45 +0100 Subject: [PATCH 7/9] WIP --- lessons/pydata/databases/index.ipynb | 130 ++++++++++++++++++++++++--- 1 file changed, 119 insertions(+), 11 deletions(-) diff --git a/lessons/pydata/databases/index.ipynb b/lessons/pydata/databases/index.ipynb index b085e65f91..9b46b341c7 100644 --- a/lessons/pydata/databases/index.ipynb +++ b/lessons/pydata/databases/index.ipynb @@ -394,6 +394,15 @@ "Na prozkoumání struktury a obsahu databáze můžete použít nějaký specializovaný program - [DB Browser](https://sqlitebrowser.org/), [DBeaver](https://dbeaver.io/), [MySQL Workbench](https://www.mysql.com/products/workbench/), ... je jich hodně, typicky se specializují na konkrétní druh databáze, některé programy jsou zdarma a některé placené. Existují i webové aplikace, nejznámější asi český [Adminer](https://www.adminer.org/). Zde jsem vám chtěl ukázat, že toho samého se dá dosáhnout i takto z Pythonu." ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Poznámka: struktura této databáze je trochu jiná, než byl motivační příklad na začátku. Nem" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1912,9 +1921,84 @@ " ''', engine)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To GROUP BY je potřeba, protože bez toho se bude *celá* tabulka považovat za jedinou *skupinu* a použití agregačních funkcí způsobí to, že se vám vrátí jen jeden řádek výsledků:" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
COUNT(*)MIN(birth_date)MAX(birth_date)
075271857-11-112008-06-02
\n", + "
" + ], + "text/plain": [ + " COUNT(*) MIN(birth_date) MAX(birth_date)\n", + "0 7527 1857-11-11 2008-06-02" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.read_sql_query('''\n", + " SELECT COUNT(*), MIN(birth_date), MAX(birth_date)\n", + " FROM actors \n", + " ''', engine)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jaký je rozdíl mezi `COUNT(*)`, `COUNT(id)` a `COUNT(něco)`?\n", + "\n", + "`COUNT(*)` vrací počet řádků. `COUNT(sloupec)` vrací počet řádků, ve kterých je v daném sloupci nějaká hodnota (tj. není tam NULL). Pokud tím sloupcem je `id`, který je téměř vždy NON-NULL, tak je `COUNT(id)` a `COUNT(*)` vlastně to samé :)\n" + ] + }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 60, "metadata": {}, "outputs": [ { @@ -1959,7 +2043,7 @@ "0 7527 7527 5753" ] }, - "execution_count": 32, + "execution_count": 60, "metadata": {}, "output_type": "execute_result" } @@ -1971,6 +2055,13 @@ " ''', engine)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jak je vidět, u některých herců není vyplněno `birth_date`." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1979,13 +2070,13 @@ "\n", "Ještě rekapitulace, jak se probíhá provádění SQL dotazu :)\n", "\n", - "1. databáze vezme tabulky vyjmenované ve FROM a JOIN\n", - "2. databáze čte řádky (jeden po druhém) z těch tabulek (už spojené podle příslušných JOIN výrazů)\n", + "1. databáze vezme tabulky vyjmenované ve FROM\n", + "2. databáze čte řádky (jeden po druhém)\n", "3. ty řádky se filtrují podle uvedených WHERE výrazů\n", "4. přefiltrované řádky se seskupí podle GROUP BY výrazů do skupin\n", "5. ty skupiny se filtrují pode uvedených HAVING výrazů\n", - "6. to,\n", - "\n", + "6. výsledek se seřadí podle ORDER BY\n", + "7. výsledek se ořízne podle LIMIT\n", "\n", "Probrali jsme jen to nejdůležitější. Pro představu, jaké jsou možnosti zápisu SELECT dotazu\n", "(převzato z [dokumentace SQLite](https://www.sqlite.org/lang_select.html)):\n", @@ -2014,14 +2105,14 @@ "source": [ "## JOIN\n", "\n", - "TODO: tady bude ukázka JOIN v SQL vs. merge v DataFrame\n", + "JOIN je v SQL to samé, co je merge v DataFrame (viz některá předchozí hodina).\n", "\n", "
" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 61, "metadata": {}, "outputs": [ { @@ -2188,7 +2279,7 @@ "[9811 rows x 6 columns]" ] }, - "execution_count": 33, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" } @@ -2196,7 +2287,7 @@ "source": [ "pd.read_sql_query('''\n", " SELECT movie_id, title, actor_id, name, a.id, m.id AS idecko_filmu\n", - " FROM actors AS a\n", + " FROM actors AS a\n", " LEFT JOIN movie_to_actor AS ma ON a.id = ma.actor_id\n", " LEFT JOIN movies AS m ON m.id = ma.movie_id\n", "''', engine)" @@ -2206,7 +2297,24 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## CREATE TABLE" + "## CREATE TABLE\n", + "\n", + "Pokud budeme chtít vytvořit novou tabulku, používá se k tomu příkaz CREATE TABLE.\n", + "Musíme vyjmenovat názvy a typy sloupců, které v tabulce chceme mít." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pd.read_sql_query('''\n", + " CREATE TABLE pokus (\n", + " id INT PRIMARY KEY,\n", + " \n", + " ) \n", + "''', engine)" ] }, { From 70cd7f8046af9e05765a1a1e504b450962774d47 Mon Sep 17 00:00:00 2001 From: Petr Messner Date: Wed, 18 Mar 2020 14:30:43 +0100 Subject: [PATCH 8/9] width pryc --- lessons/pydata/databases/index.ipynb | 88 ++++++++++++++++++---------- 1 file changed, 58 insertions(+), 30 deletions(-) diff --git a/lessons/pydata/databases/index.ipynb b/lessons/pydata/databases/index.ipynb index 9b46b341c7..a759f41197 100644 --- a/lessons/pydata/databases/index.ipynb +++ b/lessons/pydata/databases/index.ipynb @@ -395,12 +395,11 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "Poznámka: struktura této databáze je trochu jiná, než byl motivační příklad na začátku. Nem" + "Poznámka: struktura této databáze je trochu jiná, než byl motivační příklad na začátku.\n", + "Nemáme tu `directors`, máme tu `actors`." ] }, { @@ -420,7 +419,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 10, @@ -537,7 +536,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -567,7 +566,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -598,7 +597,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -1410,7 +1409,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -1423,7 +1422,7 @@ " (1865, 'https://www.csfd.cz/tvurce/354371-pierce-pope/', 'Pierce Pope', '2008-06-02')]" ] }, - "execution_count": 44, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -1437,7 +1436,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 28, "metadata": { "scrolled": true }, @@ -1525,7 +1524,7 @@ "1864 Pierce Pope 2008-06-02 " ] }, - "execution_count": 45, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -1543,7 +1542,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -1630,7 +1629,7 @@ "6 Gentlemani 2019 90.4" ] }, - "execution_count": 49, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -1645,7 +1644,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -1757,7 +1756,7 @@ "15 https://www.csfd.cz/film/332773-le-mans-66/ 2019 90.5 " ] }, - "execution_count": 57, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -1780,7 +1779,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -1807,7 +1806,7 @@ " (1957, 6)]" ] }, - "execution_count": 30, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -1820,7 +1819,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -1905,7 +1904,7 @@ "4 1993 11 84.6 86.027273 92.3" ] }, - "execution_count": 31, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -1930,7 +1929,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -1975,7 +1974,7 @@ "0 7527 1857-11-11 2008-06-02" ] }, - "execution_count": 59, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -1998,7 +1997,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -2043,7 +2042,7 @@ "0 7527 7527 5753" ] }, - "execution_count": 60, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -2081,7 +2080,7 @@ "Probrali jsme jen to nejdůležitější. Pro představu, jaké jsou možnosti zápisu SELECT dotazu\n", "(převzato z [dokumentace SQLite](https://www.sqlite.org/lang_select.html)):\n", "\n", - "


" + "


" ] }, { @@ -2107,12 +2106,12 @@ "\n", "JOIN je v SQL to samé, co je merge v DataFrame (viz některá předchozí hodina).\n", "\n", - "
" + "
" ] }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -2279,7 +2278,7 @@ "[9811 rows x 6 columns]" ] }, - "execution_count": 61, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -2305,9 +2304,38 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "OperationalError", + "evalue": "(sqlite3.OperationalError) near \")\": syntax error\n[SQL: \n CREATE TABLE pokus (\n id INT PRIMARY KEY,\n \n ) \n]\n(Background on this error at: http://sqlalche.me/e/e3q8)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mOperationalError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/base.py\u001b[0m in \u001b[0;36m_execute_context\u001b[0;34m(self, dialect, constructor, statement, parameters, *args)\u001b[0m\n\u001b[1;32m 1245\u001b[0m self.dialect.do_execute(\n\u001b[0;32m-> 1246\u001b[0;31m \u001b[0mcursor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1247\u001b[0m )\n", + "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/default.py\u001b[0m in \u001b[0;36mdo_execute\u001b[0;34m(self, cursor, statement, parameters, context)\u001b[0m\n\u001b[1;32m 587\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdo_execute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcursor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 588\u001b[0;31m \u001b[0mcursor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 589\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mOperationalError\u001b[0m: near \")\": syntax error", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mOperationalError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m ) \n\u001b[0;32m----> 6\u001b[0;31m ''', engine)\n\u001b[0m", + "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/sql.py\u001b[0m in \u001b[0;36mread_sql_query\u001b[0;34m(sql, con, index_col, coerce_float, params, parse_dates, chunksize)\u001b[0m\n\u001b[1;32m 330\u001b[0m \u001b[0mcoerce_float\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcoerce_float\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 331\u001b[0m \u001b[0mparse_dates\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mparse_dates\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 332\u001b[0;31m \u001b[0mchunksize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mchunksize\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 333\u001b[0m )\n\u001b[1;32m 334\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/sql.py\u001b[0m in \u001b[0;36mread_query\u001b[0;34m(self, sql, index_col, coerce_float, parse_dates, params, chunksize)\u001b[0m\n\u001b[1;32m 1216\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_convert_params\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msql\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1217\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1218\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1219\u001b[0m \u001b[0mcolumns\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1220\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/sql.py\u001b[0m in \u001b[0;36mexecute\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1085\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1086\u001b[0m \u001b[0;34m\"\"\"Simple passthrough to SQLAlchemy connectable\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1087\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconnectable\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1088\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1089\u001b[0m def read_table(\n", + "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/base.py\u001b[0m in \u001b[0;36mexecute\u001b[0;34m(self, statement, *multiparams, **params)\u001b[0m\n\u001b[1;32m 2180\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2181\u001b[0m \u001b[0mconnection\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_contextual_connect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclose_with_result\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2182\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mconnection\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mmultiparams\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2183\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2184\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mscalar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mmultiparams\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/base.py\u001b[0m in \u001b[0;36mexecute\u001b[0;34m(self, object_, *multiparams, **params)\u001b[0m\n\u001b[1;32m 974\u001b[0m \"\"\"\n\u001b[1;32m 975\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mutil\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstring_types\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 976\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_execute_text\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmultiparams\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 977\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 978\u001b[0m \u001b[0mmeth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mobject_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_execute_on_connection\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/base.py\u001b[0m in \u001b[0;36m_execute_text\u001b[0;34m(self, statement, multiparams, params)\u001b[0m\n\u001b[1;32m 1147\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1148\u001b[0m \u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1149\u001b[0;31m \u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1150\u001b[0m )\n\u001b[1;32m 1151\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_has_events\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mengine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_has_events\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/base.py\u001b[0m in \u001b[0;36m_execute_context\u001b[0;34m(self, dialect, constructor, statement, parameters, *args)\u001b[0m\n\u001b[1;32m 1248\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mBaseException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1249\u001b[0m self._handle_dbapi_exception(\n\u001b[0;32m-> 1250\u001b[0;31m \u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcursor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1251\u001b[0m )\n\u001b[1;32m 1252\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/base.py\u001b[0m in \u001b[0;36m_handle_dbapi_exception\u001b[0;34m(self, e, statement, parameters, cursor, context)\u001b[0m\n\u001b[1;32m 1474\u001b[0m \u001b[0mutil\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mraise_from_cause\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnewraise\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexc_info\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1475\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mshould_wrap\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1476\u001b[0;31m \u001b[0mutil\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mraise_from_cause\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msqlalchemy_exception\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexc_info\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1477\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1478\u001b[0m \u001b[0mutil\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreraise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mexc_info\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/util/compat.py\u001b[0m in \u001b[0;36mraise_from_cause\u001b[0;34m(exception, exc_info)\u001b[0m\n\u001b[1;32m 396\u001b[0m \u001b[0mexc_type\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexc_value\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexc_tb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexc_info\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 397\u001b[0m \u001b[0mcause\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mexc_value\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mexc_value\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mexception\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 398\u001b[0;31m \u001b[0mreraise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexception\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtb\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mexc_tb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcause\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 399\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 400\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/util/compat.py\u001b[0m in \u001b[0;36mreraise\u001b[0;34m(tp, value, tb, cause)\u001b[0m\n\u001b[1;32m 150\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__cause__\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcause\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 151\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__traceback__\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mtb\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 152\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwith_traceback\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 153\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/base.py\u001b[0m in \u001b[0;36m_execute_context\u001b[0;34m(self, dialect, constructor, statement, parameters, *args)\u001b[0m\n\u001b[1;32m 1244\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mevt_handled\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1245\u001b[0m self.dialect.do_execute(\n\u001b[0;32m-> 1246\u001b[0;31m \u001b[0mcursor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1247\u001b[0m )\n\u001b[1;32m 1248\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mBaseException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/default.py\u001b[0m in \u001b[0;36mdo_execute\u001b[0;34m(self, cursor, statement, parameters, context)\u001b[0m\n\u001b[1;32m 586\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 587\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdo_execute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcursor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 588\u001b[0;31m \u001b[0mcursor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 589\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 590\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdo_execute_no_params\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcursor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mOperationalError\u001b[0m: (sqlite3.OperationalError) near \")\": syntax error\n[SQL: \n CREATE TABLE pokus (\n id INT PRIMARY KEY,\n \n ) \n]\n(Background on this error at: http://sqlalche.me/e/e3q8)" + ] + } + ], "source": [ "pd.read_sql_query('''\n", " CREATE TABLE pokus (\n", From 4d6a52d392968d5f45fd1af43fb4b0d55a16c1fd Mon Sep 17 00:00:00 2001 From: Petr Messner Date: Wed, 18 Mar 2020 14:43:39 +0100 Subject: [PATCH 9/9] hotfix :/ --- lessons/pydata/databases/index.ipynb | 32 +++++++++++++++------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/lessons/pydata/databases/index.ipynb b/lessons/pydata/databases/index.ipynb index a759f41197..aa53e07734 100644 --- a/lessons/pydata/databases/index.ipynb +++ b/lessons/pydata/databases/index.ipynb @@ -419,7 +419,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 10, @@ -2304,25 +2304,22 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 39, "metadata": {}, "outputs": [ { "ename": "OperationalError", - "evalue": "(sqlite3.OperationalError) near \")\": syntax error\n[SQL: \n CREATE TABLE pokus (\n id INT PRIMARY KEY,\n \n ) \n]\n(Background on this error at: http://sqlalche.me/e/e3q8)", + "evalue": "(sqlite3.OperationalError) database is locked\n[SQL: \n CREATE TABLE phonebook (\n id INT PRIMARY KEY,\n name VARCHAR,\n phone_number VARCHAR\n ) \n]\n(Background on this error at: http://sqlalche.me/e/e3q8)", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mOperationalError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/base.py\u001b[0m in \u001b[0;36m_execute_context\u001b[0;34m(self, dialect, constructor, statement, parameters, *args)\u001b[0m\n\u001b[1;32m 1245\u001b[0m self.dialect.do_execute(\n\u001b[0;32m-> 1246\u001b[0;31m \u001b[0mcursor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1247\u001b[0m )\n", "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/default.py\u001b[0m in \u001b[0;36mdo_execute\u001b[0;34m(self, cursor, statement, parameters, context)\u001b[0m\n\u001b[1;32m 587\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdo_execute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcursor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 588\u001b[0;31m \u001b[0mcursor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 589\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mOperationalError\u001b[0m: near \")\": syntax error", + "\u001b[0;31mOperationalError\u001b[0m: database is locked", "\nThe above exception was the direct cause of the following exception:\n", "\u001b[0;31mOperationalError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m ) \n\u001b[0;32m----> 6\u001b[0;31m ''', engine)\n\u001b[0m", - "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/sql.py\u001b[0m in \u001b[0;36mread_sql_query\u001b[0;34m(sql, con, index_col, coerce_float, params, parse_dates, chunksize)\u001b[0m\n\u001b[1;32m 330\u001b[0m \u001b[0mcoerce_float\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcoerce_float\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 331\u001b[0m \u001b[0mparse_dates\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mparse_dates\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 332\u001b[0;31m \u001b[0mchunksize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mchunksize\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 333\u001b[0m )\n\u001b[1;32m 334\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/sql.py\u001b[0m in \u001b[0;36mread_query\u001b[0;34m(self, sql, index_col, coerce_float, parse_dates, params, chunksize)\u001b[0m\n\u001b[1;32m 1216\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_convert_params\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msql\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1217\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1218\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1219\u001b[0m \u001b[0mcolumns\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1220\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/sql.py\u001b[0m in \u001b[0;36mexecute\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1085\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1086\u001b[0m \u001b[0;34m\"\"\"Simple passthrough to SQLAlchemy connectable\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1087\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconnectable\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1088\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1089\u001b[0m def read_table(\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mphone_number\u001b[0m \u001b[0mVARCHAR\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m ) \n\u001b[0;32m----> 7\u001b[0;31m ''')\n\u001b[0m", "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/base.py\u001b[0m in \u001b[0;36mexecute\u001b[0;34m(self, statement, *multiparams, **params)\u001b[0m\n\u001b[1;32m 2180\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2181\u001b[0m \u001b[0mconnection\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_contextual_connect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclose_with_result\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2182\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mconnection\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mmultiparams\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2183\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2184\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mscalar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mmultiparams\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/base.py\u001b[0m in \u001b[0;36mexecute\u001b[0;34m(self, object_, *multiparams, **params)\u001b[0m\n\u001b[1;32m 974\u001b[0m \"\"\"\n\u001b[1;32m 975\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mutil\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstring_types\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 976\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_execute_text\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmultiparams\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 977\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 978\u001b[0m \u001b[0mmeth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mobject_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_execute_on_connection\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/base.py\u001b[0m in \u001b[0;36m_execute_text\u001b[0;34m(self, statement, multiparams, params)\u001b[0m\n\u001b[1;32m 1147\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1148\u001b[0m \u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1149\u001b[0;31m \u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1150\u001b[0m )\n\u001b[1;32m 1151\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_has_events\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mengine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_has_events\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", @@ -2332,17 +2329,22 @@ "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/util/compat.py\u001b[0m in \u001b[0;36mreraise\u001b[0;34m(tp, value, tb, cause)\u001b[0m\n\u001b[1;32m 150\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__cause__\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcause\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 151\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__traceback__\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mtb\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 152\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwith_traceback\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 153\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/base.py\u001b[0m in \u001b[0;36m_execute_context\u001b[0;34m(self, dialect, constructor, statement, parameters, *args)\u001b[0m\n\u001b[1;32m 1244\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mevt_handled\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1245\u001b[0m self.dialect.do_execute(\n\u001b[0;32m-> 1246\u001b[0;31m \u001b[0mcursor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1247\u001b[0m )\n\u001b[1;32m 1248\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mBaseException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sqlalchemy/engine/default.py\u001b[0m in \u001b[0;36mdo_execute\u001b[0;34m(self, cursor, statement, parameters, context)\u001b[0m\n\u001b[1;32m 586\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 587\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdo_execute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcursor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 588\u001b[0;31m \u001b[0mcursor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 589\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 590\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdo_execute_no_params\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcursor\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatement\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mOperationalError\u001b[0m: (sqlite3.OperationalError) near \")\": syntax error\n[SQL: \n CREATE TABLE pokus (\n id INT PRIMARY KEY,\n \n ) \n]\n(Background on this error at: http://sqlalche.me/e/e3q8)" + "\u001b[0;31mOperationalError\u001b[0m: (sqlite3.OperationalError) database is locked\n[SQL: \n CREATE TABLE phonebook (\n id INT PRIMARY KEY,\n name VARCHAR,\n phone_number VARCHAR\n ) \n]\n(Background on this error at: http://sqlalche.me/e/e3q8)" ] } ], "source": [ - "pd.read_sql_query('''\n", - " CREATE TABLE pokus (\n", - " id INT PRIMARY KEY,\n", - " \n", - " ) \n", - "''', engine)" + "try:\n", + " engine.execute('''\n", + " CREATE TABLE phonebook (\n", + " id INT PRIMARY KEY,\n", + " name VARCHAR,\n", + " phone_number VARCHAR\n", + " ) \n", + " ''')\n", + "except OperationalError as e:\n", + " if str(e) == 'database is locked':\n", + " print('Zkus zabit kernel a znovu spustit primo tento prikaz :/ Me')" ] }, {