cds-104_Datenbanken/.ipynb_checkpoints/PostgreSQL-Python-checkpoint.ipynb
2026-04-19 14:50:00 +02:00

266 lines
9.1 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "b53d472a-14d4-42bb-a0ee-38eb8c9c24a8",
"metadata": {},
"source": [
"Zunächst muss ein Paket zur Anbindung installiert werden. Wir verwenden psycopg 2 (psycopg.org).\n",
"Dies kann über den Reiter \"Environment\" im Anaconda Navicator installiert werden.\n",
"Ist dies geschehen können wir das Paket importieren."
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "0d3fea87-d2a6-4da8-9327-4c08bb70ef9e",
"metadata": {},
"outputs": [],
"source": [
"import psycopg2, psycopg2.extras"
]
},
{
"cell_type": "markdown",
"id": "bedf4588-60dc-4169-9295-21f6b3317e9f",
"metadata": {},
"source": [
"Nun sind wir bereit, um eine Verbindung zur Datenbank aufzubauen. Nehmen wir zum Beispiel die \"bank\" Datenbank. Da wir die Installation local haben, muss keine URL angegeben werden. Dafür legen wir eine Variable mit dem connect Befehl an."
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "62b5a0b5-bafd-4125-8b62-4a2aa493a061",
"metadata": {},
"outputs": [],
"source": [
"conn = psycopg2.connect(\"dbname=bank host=/var/run/postgresql user=postgres password=sml12345\")"
]
},
{
"cell_type": "markdown",
"id": "8861806c-5786-42fb-81d3-1ba5283b1d2b",
"metadata": {},
"source": [
"Als nächstes führen wir eine einfache SELECT Abfrage aus.\n",
"Zunächst werden wir verbunden, dann stellen wir die Abfrage, dann rufen wir das Ergebnis der Abfrage ab und lassen es uns anzeigen.\n",
"Dazu benötigen wir ein cursor Objekt, das uns die Abfrage aber auch die Rücklieferung der Daten liefert. Dieses kommt in die Variable cursor.\n",
"Die Variable result speichert uns die Ergebnisse. fetchall wartet bis alle Ergebniszeilen geliefert sind und ermöglicht dann die Anzeige."
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "09dbc41c-0ed7-449a-853d-3a18fbb1d97e",
"metadata": {},
"outputs": [],
"source": [
"cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)\n",
"cursor.execute(\"SELECT * FROM account;\")\n",
"result = cursor.fetchall()"
]
},
{
"cell_type": "markdown",
"id": "81c22552-4d3c-4824-82c7-5b8a0c74402c",
"metadata": {},
"source": [
"Pro Klammer bekommen wir nun ein Tupel angezeigt. Das ist noch nicht so schön. Mit einer kleinen Schleife können wir uns die Tupel zeilenweise anzeigen lassen."
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "dba24620-fe85-4feb-8109-59a3d7c5e3b3",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1, 'CHK', 1, datetime.date(2000, 1, 15), None, datetime.date(2005, 1, 4), 'ACTIVE', 2, 10, 1057.75, 1057.75]\n",
"[2, 'SAV', 1, datetime.date(2000, 1, 15), None, datetime.date(2004, 12, 19), 'ACTIVE', 2, 10, 500.0, 500.0]\n",
"[3, 'CD', 1, datetime.date(2004, 6, 30), None, datetime.date(2004, 6, 30), 'ACTIVE', 2, 10, 3000.0, 3000.0]\n",
"[4, 'CHK', 2, datetime.date(2001, 3, 12), None, datetime.date(2004, 12, 27), 'ACTIVE', 2, 10, 2258.02, 2258.02]\n",
"[5, 'SAV', 2, datetime.date(2001, 3, 12), None, datetime.date(2004, 12, 11), 'ACTIVE', 2, 10, 200.0, 200.0]\n",
"[7, 'CHK', 3, datetime.date(2002, 11, 23), None, datetime.date(2004, 11, 30), 'ACTIVE', 3, 13, 1057.75, 1057.75]\n",
"[8, 'MM', 3, datetime.date(2002, 12, 15), None, datetime.date(2004, 12, 5), 'ACTIVE', 3, 13, 2212.5, 2212.5]\n",
"[10, 'CHK', 4, datetime.date(2003, 9, 12), None, datetime.date(2005, 1, 3), 'ACTIVE', 1, 1, 534.12, 534.12]\n",
"[11, 'SAV', 4, datetime.date(2000, 1, 15), None, datetime.date(2004, 10, 24), 'ACTIVE', 1, 1, 767.77, 767.77]\n",
"[12, 'MM', 4, datetime.date(2004, 9, 30), None, datetime.date(2004, 11, 11), 'ACTIVE', 1, 1, 5487.09, 5487.09]\n",
"[13, 'CHK', 5, datetime.date(2004, 1, 27), None, datetime.date(2005, 1, 5), 'ACTIVE', 4, 16, 2237.97, 2897.97]\n",
"[14, 'CHK', 6, datetime.date(2002, 8, 24), None, datetime.date(2004, 11, 29), 'ACTIVE', 1, 1, 122.37, 122.37]\n",
"[15, 'CD', 6, datetime.date(2004, 12, 28), None, datetime.date(2004, 12, 28), 'ACTIVE', 1, 1, 10000.0, 10000.0]\n",
"[17, 'CD', 7, datetime.date(2004, 1, 12), None, datetime.date(2004, 1, 12), 'ACTIVE', 2, 10, 5000.0, 5000.0]\n",
"[18, 'CHK', 8, datetime.date(2001, 5, 23), None, datetime.date(2005, 1, 3), 'ACTIVE', 4, 16, 3487.19, 3487.19]\n",
"[19, 'SAV', 8, datetime.date(2001, 5, 23), None, datetime.date(2004, 10, 12), 'ACTIVE', 4, 16, 387.99, 387.99]\n",
"[21, 'CHK', 9, datetime.date(2003, 7, 30), None, datetime.date(2004, 12, 15), 'ACTIVE', 1, 1, 125.67, 125.67]\n",
"[22, 'MM', 9, datetime.date(2004, 10, 28), None, datetime.date(2004, 10, 28), 'ACTIVE', 1, 1, 9345.55, 9845.55]\n",
"[23, 'CD', 9, datetime.date(2004, 6, 30), None, datetime.date(2004, 6, 30), 'ACTIVE', 1, 1, 1500.0, 1500.0]\n",
"[24, 'CHK', 10, datetime.date(2002, 9, 30), None, datetime.date(2004, 12, 15), 'ACTIVE', 4, 16, 23575.12, 23575.12]\n",
"[25, 'BUS', 10, datetime.date(2002, 10, 1), None, datetime.date(2004, 8, 28), 'ACTIVE', 4, 16, 0.0, 0.0]\n",
"[27, 'BUS', 11, datetime.date(2004, 3, 22), None, datetime.date(2004, 11, 14), 'ACTIVE', 2, 10, 9345.55, 9345.55]\n",
"[28, 'CHK', 12, datetime.date(2003, 7, 30), None, datetime.date(2004, 12, 15), 'ACTIVE', 4, 16, 38552.05, 38552.05]\n",
"[29, 'SBL', 13, datetime.date(2004, 2, 22), None, datetime.date(2004, 12, 17), 'ACTIVE', 3, 13, 50000.0, 50000.0]\n"
]
}
],
"source": [
"for entry in result:\n",
" print(entry)"
]
},
{
"cell_type": "markdown",
"id": "b975ba44-de7e-4337-a2f9-a4fa06fc59b1",
"metadata": {},
"source": [
"Wollen wir nur eine bestimmte Spalte geht dies über die Angabe der Spaltennummer."
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "6159012d-ea9c-44da-bec0-5d073d210bd3",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1057.75\n",
"500.0\n",
"3000.0\n",
"2258.02\n",
"200.0\n",
"1057.75\n",
"2212.5\n",
"534.12\n",
"767.77\n",
"5487.09\n",
"2237.97\n",
"122.37\n",
"10000.0\n",
"5000.0\n",
"3487.19\n",
"387.99\n",
"125.67\n",
"9345.55\n",
"1500.0\n",
"23575.12\n",
"0.0\n",
"9345.55\n",
"38552.05\n",
"50000.0\n"
]
}
],
"source": []
},
{
"cell_type": "markdown",
"id": "b3180855-e952-4d4a-86b5-a27c9d326f69",
"metadata": {},
"source": [
"Spaltennummern zählen ist nun etwas aufwendig und unschön. Mit einer Erweituerung des Pakets können wir den cursor anpassen und dann auch Spaltennamen angeben. Wir wählen psycopg2.extras und dann einen DictCursor."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "75b7a5c8-4677-4546-a461-e7b36b97ff5e",
"metadata": {},
"outputs": [],
"source": [
"for entry in result:\n",
" print(entry['avail_balance'])"
]
},
{
"cell_type": "markdown",
"id": "3b90228d-bbc6-40ca-bf18-abb698318603",
"metadata": {},
"source": [
"Problembehandlung Transaktion: Da wir Abfragen durchführen sollten wir diese auch korrekt starten und abschliessen. Vor allem wenn es zu einem Fehler (z.B. einem Tippfehler) kommt. Anosnten laufen wir auf eine Fehlermeldung und eine offen Transaktion.\n",
"Die Lösung ist unseren SQL Befehl in einen try, except bzw finally Block zu setzen.\n",
"MIt conn.commit() wird die Durchführung der Transaktion bestätigt."
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "2e24b6bb-4773-4652-b027-7ee4faf6db92",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 1057.75\n",
"3 3000.0\n",
"4 2258.02\n",
"7 1057.75\n",
"8 2212.5\n",
"12 5487.09\n",
"13 2237.97\n",
"15 10000.0\n",
"17 5000.0\n",
"18 3487.19\n",
"22 9345.55\n",
"23 1500.0\n",
"24 23575.12\n",
"27 9345.55\n",
"28 38552.05\n",
"29 50000.0\n"
]
}
],
"source": [
"try:\n",
" cursor.execute(\n",
" 'select * from account where avail_balance > 1000;'\n",
" )\n",
" result = cursor.fetchall()\n",
" result\n",
"\n",
" for row in result:\n",
" print(row[0], row['avail_balance'])\n",
" \n",
" conn.commit()\n",
"except:\n",
" conn.rollback()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4e2f6948-9a18-421c-b64c-85ed9743b28f",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [conda env:base] *",
"language": "python",
"name": "conda-base-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}