=====Python 3 und die SQLite Datenbank====
Für einfache Anwendungen eignet sich unter Python die [[https://www.sqlite.org/ | 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: [[http://blog.red-database-security.com/2009/01/17/tutorial-oracle-sql-injection-in-webapps-part-i/|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 ====
siehe https://docs.python.org/3/library/sqlite3.html