Benutzer-Werkzeuge

Webseiten-Werkzeuge


python:python_sqlite_database

Python 3 und die SQLite Datenbank

Für einfache Anwendungen eignet sich unter Python die SQLite Datenbank, da die notwendige DB Software unter einer Standard Python 3 Umgebung sofort zur Verfügung steht.

In vielen Beispielen im Netz werden keine Bind Variablen verwendet, davon ist dringend abzuraten!

D.h. die SQL Statements werden als String Objekte „zusammen gebaut“ und dann ausgeführt!

Das ist eine der Hauptursachen für die ganzen SQL Injection Problem in vielen Anwendungen! Mehr dazu siehe hier: Alexander Kornbrust -Tutorial: Oracle SQL Injection in Webapps – Part I

Datenbank anlegen

import os,sys,sqlite3
 
if os.path.exists("emp.db"):
    print("EMP DB exits")
    sys.exit(0)
 
connection=sqlite3.connect("emp.db")
 
cursor=connection.cursor()
 
create_dept="""CREATE TABLE DEPT
           ( DEPTNO INTEGER PRIMARY KEY
           , DNAME TEXT
           , LOC TEXT ) """
 
create_emp="""CREATE TABLE EMP
       ( EMPNO INTEGER PRIMARY KEY
       , ENAME TEXT
       , JOB TEXT
       , MGR INTEGER
       , HIREDATE TEXT
       , SAL FLOAT
       , COMM FLOAT
       , DEPTNO INTEGER )"""
 
cursor.execute(create_dept)
cursor.execute(create_emp)
 
connection.close()

Erste Daten einfügen

import os,sys,sqlite3
 
dbname="emp.db"
 
if os.path.exists(dbname):
    print("EMP DB exits in ",os.getcwd())
else:
    print("No Database found in ::",os.getcwd())
    sys.exit(0)
 
connection=sqlite3.connect(dbname)
 
cursor=connection.cursor()
 
sql_cmd="INSERT INTO EMP VALUES(?,?,?,?,?,?,?,?)"
 
l_data=[ (7371,'SMITH','CLERK',7372,'17-12-1980',800,None,20)
        ,(7372,'SCOTT','MANAGER',None,'17-12-1980',800,None,20)
        ,(7373,'ALLEN','CLERK',7374,'17-12-1980',800,None,30)
        ,(7374,'BLACKE','SALESMAN',7372,'17-12-1980',800,None,30)
        ]
 
 
#Alles aufeinmal einfügen mit 
# cursor.executemany(sql_cmd,l_data)
#
 
#Oder einzeln um jeden Fehler auch einzeln auszuwerten
for i in range(len(l_data)):
    try:
        cursor.execute(sql_cmd,l_data[i])
        connection.commit()
    except sqlite3.Error as e:
        print("SQL error",e.args)
 
#Daten wieder ausgeben
for row in cursor.execute('SELECT * FROM EMP'):
    print(row)
 
 
connection.close()

Daten abfragen

import os,sys,sqlite3
 
dbname="emp.db"
 
if os.path.exists(dbname):
    print("EMP DB exits in ",os.getcwd())
else:
    print("No Database found in ::",os.getcwd())
    sys.exit(0)
 
connection=sqlite3.connect(dbname)
#Use a row factory
#Um die Spalten Namen der Tabelle mit auszulesen
#Ansonsten nicht benötigt
connection.row_factory = sqlite3.Row
 
cursor=connection.cursor()
 
#Der SQL Text
sql_cmd="select * from emp where ename=?"
 
#Tupel anlegen für die Bindvariablen auf das letze "," achten!
param=("SCOTT",)
 
try:
    #Daten alle auslesen 
    for row in cursor.execute(sql_cmd,param):
        print(row[0],row[1],row[2])       
except sqlite3.Error as e:
    print("SQL error",e.args)
 
##########################
#Zweite Variante für die Bindvariablen mit Directory Object
#Der SQL Text
sql_cmd="select * from emp where ename=:ename and job=:job "
 
#Bindvariablen Directory Object
param={"ename": "SMITH", "job": "CLERK"}
 
cursor.execute(sql_cmd,param)
 
c=1
while row:
    row=cursor.fetchone()
    #Nur beim ersten Durchlauf die Kopf der Tabelle darstellen
    if c:
        columns=row.keys()
        for fieldname in columns:
            print(fieldname," | ",end="")
        print("\n",40*"-")
        c=0
    #Nur falls auch wirklich ein Datensatz gefunden wurde    
    if row:
        for field in row:
            print(field," | ",end="")
 
    print()    
 
 
#Alternativ nur wenn Row Factory auf Default
#
#while row:
#    row=cursor.fetchone()
#    print(row)
 
#Alternativ ausgeben mit
#for row in cursor.fetchall():
#    print(row)
 
 
connection.close()

Eine Funktion registrieren und verwenden

import os,sys,sqlite3
 
dbname="emp.db"
 
if os.path.exists(dbname):
    print("EMP DB exits in ",os.getcwd())
else:
    print("No Database found in ::",os.getcwd())
    sys.exit(0)
 
connection=sqlite3.connect(dbname)
 
#Register a function
#Eine eigene oder eine aus dem allgemeinen Standard kann verwendet werden
connection.create_function("lower", 1, str.lower)
 
cursor=connection.cursor()
 
#Der SQL Text
#verwende den Namen der Funktion wie in SQL gewohnt
sql_cmd="select empno,lower(ename),lower(job) from emp where ename=?"
 
#Tupel anlegen für die Bindvariablen auf das letze "," achten!
param=("SCOTT",)
 
try:
    #Daten alle auslesen 
    for row in cursor.execute(sql_cmd,param):
        print(row[0],row[1],row[2])       
except sqlite3.Error as e:
    print("SQL error",e.args)
 
connection.close()

Daten veränderen

import os,sys,sqlite3
 
dbname="emp.db"
 
if os.path.exists(dbname):
    print("EMP DB exits in ",os.getcwd())
else:
    print("No Database found in ::",os.getcwd())
    sys.exit(0)
 
connection=sqlite3.connect(dbname)
 
cursor=connection.cursor()
 
#Der SQL Text
#verwende den Namen der Funktion wie in SQL gewohnt
sql_cmd="update emp set sal=sal+100 where ename like ?"
 
#Tupel anlegen für die Bindvariablen auf das letze "," achten!
param=("S%",)
 
try:
    #Daten aktualisieren
    cursor.execute(sql_cmd,param)
 
    #Anzahl der geänderten Datensätze ausgeben
    print("Es wurden ",str(cursor.rowcount),"Datensätze verändert")
 
    #Commit
    connection.commit()
except sqlite3.Error as e:
    #Rollback
    connection.rollback()
    print("SQL error",e.args)
 
 
connection.close()

Quellen

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
"Autor: Gunther Pipperr"
python/python_sqlite_database.txt · Zuletzt geändert: 2015/08/24 13:31 von Gunther Pippèrr