Skip to content
Snippets Groups Projects
Commit e7ae4588 authored by majidrouhanintnu's avatar majidrouhanintnu
Browse files

upd

parent 63bb9eb2
Branches
No related tags found
No related merge requests found
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### MySQL database ### MySQL database
Man kan koble opp mot forskjellige databaser i Python: Man kan koble opp mot forskjellige databaser i Python:
- GadFly - GadFly
- mSQL - mSQL
- **MySQL** - **MySQL**
- PostgreSQL - PostgreSQL
- Microsoft SQL Server 2000 - Microsoft SQL Server 2000
- Informix - Informix
- Interbase - Interbase
- Oracle - Oracle
- Sybase - Sybase
- -
Eller bruke SqlLite3 Eller bruke SqlLite3
- Egen database modul for Python - Egen database modul for Python
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# Viser hvordan vi kobler oss mot MySQL og leser/oppdaterer data. # Viser hvordan vi kobler oss mot MySQL og leser/oppdaterer data.
# Må installere PyMySQL først: pip install pymysql # Må installere PyMySQL først: pip install pymysql
import pymysql import pymysql
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
For å logge oss inn på databasen, må vi ha en konto på database-serveren. For å logge oss inn på databasen, må vi ha en konto på database-serveren.
Følgende informasjon må vi ha: Følgende informasjon må vi ha:
- host: navn på database-server - host: navn på database-server
- user: brukernavn for å koble oss til serveren - user: brukernavn for å koble oss til serveren
- password: passord for å koble oss til serveren - password: passord for å koble oss til serveren
- database: database seed (en database server kan inneholde mange database instanser) - database: database seed (en database server kan inneholde mange database instanser)
Dersom vi ikke ønsker å "hardkode" passord (skrive det i programmet i klar tekst eller i en fil), kan vi bruke modulen **getPass** for å taste inn passordet når programmet starter. Dersom vi ikke ønsker å "hardkode" passord (skrive det i programmet i klar tekst eller i en fil), kan vi bruke modulen **getPass** for å taste inn passordet når programmet starter.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# importer funksjonen getpass fra modulen getpass. # importer funksjonen getpass fra modulen getpass.
# Vi bruker getpass for å lese passord fra bruker (slik at det ikke vises i klartekst) # Vi bruker getpass for å lese passord fra bruker (slik at det ikke vises i klartekst)
from getpass import getpass from getpass import getpass
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# Database connection object # Database connection object
global db_connection global db_connection
db_connection = None db_connection = None
my_host = "mysql.stud.iie.ntnu.no" my_host = "mysql.stud.iie.ntnu.no"
my_user = "rouhani" # Skriv inn brukernavnet ditt her my_user = "rouhani" # Skriv inn brukernavnet ditt her
my_password = getpass() my_password = getpass()
my_database = "rouhani" my_database = "rouhani"
def get_db_connection(): def get_db_connection():
if 'db_connection' in globals(): if 'db_connection' in globals():
db_connection = pymysql.connect(host = my_host, user = my_user, password = my_password, database = my_database) db_connection = pymysql.connect(host = my_host, user = my_user, password = my_password, database = my_database)
return db_connection return db_connection
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Koble opp mot databasen og les fra en tabell ### Koble opp mot databasen og les fra en tabell
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
with get_db_connection() as my_db: with get_db_connection() as my_db:
my_cursor = my_db.cursor() my_cursor = my_db.cursor()
my_sql = "SELECT * FROM objects" my_sql = "SELECT * FROM objects"
my_cursor.execute(my_sql) my_cursor.execute(my_sql)
for row in my_cursor: for row in my_cursor:
print(row) print(row)
``` ```
%% Output %% Output
('TBM.0832', 'Stol', 1, '12.04.2023', 'Hanne', '12.04.2023', 'Kristin', 'Olsen Giver', 'PL.A1.B2', 'Tester') ('TBM.0832', 'Stol', 1, '12.04.2023', 'Hanne', '12.04.2023', 'Kristin', 'Olsen Giver', 'PL.A1.B2', 'Tester')
('TBM.0832-N', 'Stol', 1, '12.04.2023', 'Hanne', '12.04.2023', 'Kristin', 'Olsen Giver', 'PL.A1.B2', 'Tester')
('TBM.4892', 'Kommode', 1, '03.04.2011', 'Museumsbestyrer Olav N', '29.04.2012', 'Museumsbestyrer Olav Nilsen', 'Museumsbestyrer Olav Nilsen', 'M1.R2.P1.H1', '') ('TBM.4892', 'Kommode', 1, '03.04.2011', 'Museumsbestyrer Olav N', '29.04.2012', 'Museumsbestyrer Olav Nilsen', 'Museumsbestyrer Olav Nilsen', 'M1.R2.P1.H1', '')
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Koble opp mot databasen og oppdater rader i en tabell ### Koble opp mot databasen og oppdater rader i en tabell
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
#Sjekk om regnr existerer i databasen #Sjekk om regnr existerer i databasen
def reg_no_exist(reg_no,table_name): def reg_no_exist(reg_no,table_name):
""" """
Sjekk om regnnr existerer allerede i basen Sjekk om regnnr existerer allerede i basen
:param regnr: type string :param regnr: type string
:return: boolean :return: boolean
""" """
with get_db_connection() as db: with get_db_connection() as db:
cursor = db.cursor() cursor = db.cursor()
sql = "SELECT count(reg_no) as reg_no_count FROM {0} WHERE reg_no='{1}'".format(table_name,reg_no) sql = f"SELECT count(reg_no) as reg_no_count FROM {table_name} WHERE reg_no='{reg_no}'"
cursor.execute(sql) cursor.execute(sql)
reg_no_count = 0 reg_no_count = 0
for row in cursor: for row in cursor:
reg_no_count= row[0] reg_no_count= row[0]
if reg_no_count==0: if reg_no_count==0:
return False return False
else: else:
return True return True
#Lagrer gjenstand i basen #Lagrer gjenstand i basen
def save_object_db(giver_val, def save_object_db(giver_val,
innlemmet_dato_val, innlemmet_dato_val,
kategori_id, kategori_id,
kommentar_val, kommentar_val,
mottatt_av_val, mottatt_av_val,
navn_val, navn_val,
plassering_val, plassering_val,
registrert_av_val, registrert_av_val,
registrerings_dato_val, registrerings_dato_val,
reg_no): reg_no):
""" """
Lagre gjenstand info i databasen. Lagre gjenstand info i databasen.
Dersom den finnes allerede, blir gjenstand oppdatert Dersom den finnes allerede, blir gjenstand oppdatert
Dersom den ikke finnes, blir den opprettet. Dersom den ikke finnes, blir den opprettet.
:param giver_val: string :param giver_val: string
:param innlemmet_dato_val: string :param innlemmet_dato_val: string
:param kategori_id: int :param kategori_id: int
:param kommentar_val: string :param kommentar_val: string
:param mottatt_av_val: string :param mottatt_av_val: string
:param navn_val: string :param navn_val: string
:param plassering_val: string :param plassering_val: string
:param registrert_av_val: string :param registrert_av_val: string
:param registrerings_dato_val: string :param registrerings_dato_val: string
:param regnr: string :param regnr: string
:return: :return:
""" """
#**************************************** #****************************************
# Oppgave 4.1 # Oppgave 4.1
# Fullfør innholdet i denne funksjonen! # Fullfør innholdet i denne funksjonen!
#**************************************** #****************************************
with get_db_connection() as my_db: with get_db_connection() as my_db:
my_db.autocommit(True) my_db.autocommit(True)
cursor = my_db.cursor() cursor = my_db.cursor()
if reg_no_exist(reg_no,'objects'): if reg_no_exist(reg_no,'objects'):
cursor.execute("UPDATE objects SET giver=%s,in_date=%s,category_id=%s,comment=%s,received_by=%s,name=%s,placement=%s,reg_by=%s,reg_date=%s WHERE reg_no=%s", sql = f"UPDATE objects SET giver='{giver_val}',in_date='{innlemmet_dato_val}',category_id='{kategori_id}',comment='{kommentar_val}',received_by='{mottatt_av_val}',name='{navn_val}',placement='{plassering_val}',reg_by='{registrert_av_val}',reg_date='{registrerings_dato_val}' WHERE reg_no='{reg_no}'"
(giver_val,innlemmet_dato_val,kategori_id,kommentar_val,mottatt_av_val,navn_val,plassering_val,registrert_av_val,registrerings_dato_val,reg_no)) cursor.execute(sql)
else: else:
cursor.execute("INSERT INTO objects (giver,in_date,category_id,comment,received_by,name,placement,reg_by,reg_date,reg_no) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)", sql = f"INSERT INTO objects (giver,in_date,category_id,comment,received_by,name,placement,reg_by,reg_date,reg_no) VALUES('{giver_val}','{innlemmet_dato_val}','{kategori_id}','{kommentar_val}','{mottatt_av_val}','{navn_val}','{plassering_val}','{registrert_av_val}','{registrerings_dato_val}','{reg_no}')"
(giver_val,innlemmet_dato_val,kategori_id,kommentar_val,mottatt_av_val,navn_val,plassering_val,registrert_av_val,registrerings_dato_val,reg_no)) cursor.execute(sql)
#Oppdater eksisterende rad #Oppdater eksisterende rad
save_object_db('Olsen Giver','12.04.2023', 1, 'Tester', 'Kristin', 'Stol', 'PL.A1.B2','Hanne','12.04.2023','TBM.0832') save_object_db('Olsen Giver','12.04.2023', 1, 'Tester', 'Kristin', 'Stol', 'PL.A1.B2','Hanne','12.04.2023','TBM.0832')
#legg til ny rad #legg til ny rad
save_object_db('Olsen Giver','12.04.2023', 1, 'Tester', 'Kristin', 'Stol', 'PL.A1.B2','Hanne','12.04.2023','TBM.0832-N') save_object_db('Olsen Giver','12.04.2023', 1, 'Tester', 'Kristin', 'Stol', 'PL.A1.B2','Hanne','12.04.2023','TBM.0832-N')
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### Koble opp mot databasen og fjern rader fra en tabell ### Koble opp mot databasen og fjern rader fra en tabell
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
#Slett gjenstand #Slett gjenstand
def delete_object(reg_no): def delete_object(reg_no):
""" """
:param regnr: Registreriongsnr på gjenstand som skal slettes :param regnr: Registreriongsnr på gjenstand som skal slettes
:return: ingen returverdi. :return: ingen returverdi.
Funksjonen skal finne gjenstanden og slette denne. Funksjonen skal finne gjenstanden og slette denne.
1. Slett fra properties-tabellen for det gitte registreringsnummeret 1. Slett fra properties-tabellen for det gitte registreringsnummeret
2. Slett fra provenances-tabellen for det gitte registreringsnummeret 2. Slett fra provenances-tabellen for det gitte registreringsnummeret
3. Slett fra objects-tabellen for det gitte registreringsnummeret 3. Slett fra objects-tabellen for det gitte registreringsnummeret
Dersom sletting går bra, skriv en melding til skjermen. Dersom sletting går bra, skriv en melding til skjermen.
""" """
#****************************************** #******************************************
# Oppgave 4.3 # Oppgave 4.3
# Fullfør denne funksjonen # Fullfør denne funksjonen
#****************************************** #******************************************
with get_db_connection() as db: with get_db_connection() as db:
db.autocommit(True) db.autocommit(True)
cursor = db.cursor() cursor = db.cursor()
cursor.execute("DELETE from properties where reg_no='" + reg_no+"'") cursor.execute(f"DELETE from properties where reg_no='{reg_no}'")
cursor.execute("DELETE from provenances where reg_no='" + reg_no+"'") cursor.execute(f"DELETE from provenances where reg_no='{reg_no}'")
cursor.execute("DELETE from objects where reg_no='" + reg_no+"'") cursor.execute(f"DELETE from objects where reg_no='{reg_no}'")
delete_object('TBM.0832-N') delete_object('TBM.0832-N')
``` ```
......
...@@ -10,14 +10,125 @@ paginate: true ...@@ -10,14 +10,125 @@ paginate: true
**Læringsutbytte** **Læringsutbytte**
* Lære å lese fra og skrive til fil * Lære å lese fra og skrive til fil
* Lære om unntakshåndtering og kjøretidsfeil
* Lære å koble seg mot MySql database * Lære å koble seg mot MySql database
--- ---
# Filbehandling
Vi kan
* lagre data på fil
* lese data fra fil
Når du åpner filen må du spesifisere hvordan du skal bruke filen.
Måten dette gjøres på er som inn-parameter i `open()`-funksjonen, noen eksempler er:
- **'r'** - for lesing av filen (default)
- **'w'** - for skriving til filen
- **'a'** - for å legge til data (**a**ppend) til den eksisterende filen
---
- For å åpne en fil i Python kan vi skrive: `f = open('filename', <Bruksmåte>)`.
<Bruksmåte> er enten `'r'`, `'w'` eller `'a'` avhengig av hva hvordan filen skal brukes.
- For å lese data fra en fil kan vi bruke: `innhold = f.read()`
- For å legge til data til en fil kan vi skrive: `f.write(data)`
- Filer lukkes på følgende måte: `f.close()`
---
# Lesing fra fil
```python
f = open('example_file1.txt','r') #r spesifiserer at man skal lese fra en fil
innhold = f.read()
print(innhold)
f.close()
```
---
# En bedre måte å lese fra fil
```python
with open('example_file1.txt','r') as f
innhold = f.read()
print(innhold)
```
---
# Skriving til fil
```python
f = open('example_file1.txt','w') #w spesifiserer at man skal skrive til en fil (write)
f.write('En hatefull ytring')
f.close()
```
---
# En bedre måte å skrive til fil
```python
with open('example_file1.txt','w') as f
f.write('En hatefull ytring')
```
---
# Databaser
1. Installer database-pakken for den aktuelle basen (pymysql)
2. En database må eksistere på en database server og du må ha fått tilgang
3. I Python, må du først opprette en kobling mot databasen
4. Deretter leser/oppdaterer du data
---
# Opprett kobling mot databasen
```python
# Database connection object
global db_connection
db_connection = None
my_host = "mysql.stud.iie.ntnu.no"
my_user = "rouhani" # Skriv inn brukernavnet ditt her
my_password = getpass()
my_database = "rouhani"
def get_db_connection():
if 'db_connection' in globals():
db_connection = pymysql.connect(host = my_host,
user = my_user,
password = my_password,
database = my_database)
return db_connection
```
---
# Lese data fra databasen
```python
with get_db_connection() as my_db:
my_cursor = my_db.cursor()
my_sql = "SELECT * FROM objects"
my_cursor.execute(my_sql)
for row in my_cursor:
print(row)
```
---
# Legge nye rader med data i databasen
```python ```python
...
cursor.execute(f"INSERT INTO objects (giver,...) VALUES({giver}...)")
``` ```
---
# Oppdatere data i databasen
```python
```
---
# Slette data fra databasen
```python
```
...@@ -60,13 +60,7 @@ ...@@ -60,13 +60,7 @@
{ {
"Leksjon 5: Filbehandling, unntakshåndtering, programmering mot databaser": [ "Leksjon 5: Filbehandling, unntakshåndtering, programmering mot databaser": [
{"Introduksjon (slides)": {"Introduksjon":"lecture5/notes/slides/lecture-5.pdf"}} {"Introduksjon (slides)": {"Introduksjon":"lecture5/notes/slides/lecture-5.pdf"}}
,{ ,{"Filbehandling": {"Generelt om filbehandling":"lecture5/notes/codes/generelt_om_filbehandling.ipynb"}}
"Filbehandling": [
{"Lesing fra fil":""},
{"Skriving til fil":""}
]
}
,{"Unntakshåndtering":""}
,{"Programmering mot databaser":{"Lesing og skriving til database": "lecture5/notes/codes/databaser.ipynb"}} ,{"Programmering mot databaser":{"Lesing og skriving til database": "lecture5/notes/codes/databaser.ipynb"}}
,{"Lab 5": {"Lab-5":"lecture5/lab/lab-5.md"}} ,{"Lab 5": {"Lab-5":"lecture5/lab/lab-5.md"}}
] ]
......
...@@ -95,15 +95,7 @@ ...@@ -95,15 +95,7 @@
<blockquote style="font-size:200%;cursor: pointer;padding: 10px;">&emsp;&emsp;&emsp;<a target="_blank" href=lecture5/notes/slides/lecture-5.pdf>Introduksjon</a></blockquote> <blockquote style="font-size:200%;cursor: pointer;padding: 10px;">&emsp;&emsp;&emsp;<a target="_blank" href=lecture5/notes/slides/lecture-5.pdf>Introduksjon</a></blockquote>
</details> </details>
<details><summary style="font-size:200%;cursor: pointer;">&emsp;&emsp;Filbehandling</summary> <details><summary style="font-size:200%;cursor: pointer;">&emsp;&emsp;Filbehandling</summary>
<details><summary style="font-size:200%;cursor: pointer;">&emsp;&emsp;&emsp;Lesing fra fil</summary> <blockquote style="font-size:200%;cursor: pointer;padding: 10px;">&emsp;&emsp;&emsp;<a target="_blank" href=lecture5/notes/codes/generelt_om_filbehandling.ipynb>Generelt om filbehandling</a></blockquote>
<blockquote style="font-size:200%;cursor: pointer;padding: 10px;">&emsp;&emsp;&emsp;&emsp;</blockquote>
</details>
<details><summary style="font-size:200%;cursor: pointer;">&emsp;&emsp;&emsp;Skriving til fil</summary>
<blockquote style="font-size:200%;cursor: pointer;padding: 10px;">&emsp;&emsp;&emsp;&emsp;</blockquote>
</details>
</details>
<details><summary style="font-size:200%;cursor: pointer;">&emsp;&emsp;Unntakshåndtering</summary>
<blockquote style="font-size:200%;cursor: pointer;padding: 10px;">&emsp;&emsp;&emsp;</blockquote>
</details> </details>
<details><summary style="font-size:200%;cursor: pointer;">&emsp;&emsp;Programmering mot databaser</summary> <details><summary style="font-size:200%;cursor: pointer;">&emsp;&emsp;Programmering mot databaser</summary>
<blockquote style="font-size:200%;cursor: pointer;padding: 10px;">&emsp;&emsp;&emsp;<a target="_blank" href=lecture5/notes/codes/databaser.ipynb>Lesing og skriving til database</a></blockquote> <blockquote style="font-size:200%;cursor: pointer;padding: 10px;">&emsp;&emsp;&emsp;<a target="_blank" href=lecture5/notes/codes/databaser.ipynb>Lesing og skriving til database</a></blockquote>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment