=====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