Commit 7605fad0 authored by Julian Volland's avatar Julian Volland
Browse files

Merge branch 'Development' into 'master'

Development

See merge request !4
parents 47a0278d 43c82d3d
...@@ -8,9 +8,9 @@ ...@@ -8,9 +8,9 @@
1. Anforderungen 1. Anforderungen
Min. Python version: 3.X Min. Python version: 3.X
Module: psycopg2 Module: psycopg2
User auf der Datenbank erstellen User auf der Datenbank erstellen
Schema für diesen User erstellen Schema für diesen User erstellen
2. Ausführung 2. Ausführung
...@@ -25,26 +25,26 @@ Schema für diesen User erstellen ...@@ -25,26 +25,26 @@ Schema für diesen User erstellen
Min. Python version: 3.X Min. Python version: 3.X
Module: psycopg2 Module: psycopg2
User auf der Datenbank erstellen User auf der Datenbank erstellen
Schema für diesen User erstellen Schema für diesen User erstellen
2. Benötigte Datei: 2. Benötigte Datei:
- Wählbarer Name - Wählbarer Name
=> Syntax: => Syntax:
{dbuser: [Benutzername], dbname: [Datenbankname], (dbpass: [Benutzerpasswort] -> nur wenn Benutzer passwort hat, sonst weg lassen!)} {dbuser: [Benutzername], dbname: [Datenbankname], (dbpass: [Benutzerpasswort] -> nur wenn Benutzer passwort hat, sonst weg lassen!), dbhost: [host], dbport: [port], key: [primarykey(s)]}
[Anonyme Daten Tabelle]{Schema} [Anonyme Daten Tabelle(PRIMARYKEY)]{Schema}
[tab][Tabellenname der zu anonymisierenden Tabelle]{Schema} [tab][Tabellenname der zu anonymisierenden Tabelle]{Schema}
Bsp.: Bsp.:
{dbuser: fsv, dbname: fsv} {dbuser: fsv, dbname: fsv}
[vornamen]{anonymschema} [vornamen]{anonymschema}
[benutzer][vorname]{orginalschema} [benutzer(vorname,nachname)][vorname]{orginalschema}
[angestellte][vornamen] [angestellte(kennung)][vornamen]
[pgd][pgd_vornamen]{public} [pgd][pgd_vornamen]{public}
{dbuser: anonym, dbname: devdb, dbpass: anonympass} {dbuser: anonym, dbname: devdb, dbpass: anonympass, dbhost: data.rrze.uni-erlangen.de, dbport: 5432}
[nachnamen]{testschema} [nachnamen]{testschema}
[angestellte][nachnamen] [angestellte][nachnamen]
(Bei nichtangabe von einem Schema wird das der vorherigen Zeile verwendet! (Bei der ersten Angabe von der Anonymisierungstabelle und der zu anonymisierenden Tabelle muss jeweils das Schema angegeben werden!)) (Bei nichtangabe von einem Schema wird das der vorherigen Zeile verwendet! (Bei der ersten Angabe von der Anonymisierungstabelle und der zu anonymisierenden Tabelle muss jeweils das Schema angegeben werden!))
...@@ -64,8 +64,8 @@ Schema für diesen User erstellen ...@@ -64,8 +64,8 @@ Schema für diesen User erstellen
Min. Python version: 3.X Min. Python version: 3.X
Module: psycopg2 Module: psycopg2
User auf der Datenbank erstellen User auf der Datenbank erstellen
Schema für diesen User erstellen Schema für diesen User erstellen
...@@ -87,7 +87,8 @@ Schema für diesen User erstellen ...@@ -87,7 +87,8 @@ Schema für diesen User erstellen
3. Ausführung: 3. Ausführung:
1. Tabellenliste anlegen (im Bsp. "table.txt") 1. Tabellenliste anlegen (im Bsp. "table.txt")
2. "pytablesoutoftextfile.py" ausführen => Tabellen werden ohne Daten angelegt 3. "pysqlstatementsoutoftextfile" ausführen => "createtables.sql" mit SQL-Statements wird erzeugzt
3. psql -f createtables.sql ausführen => Tabellen werden ohne Daten angelegt
......
{dbuser: fsv, dbname: fsv} {dbuser: fsv, dbname: fsv}
[vornamen]{public} [vornamen]{test}
[user][vornamen]{test} [user(vornamen,nachnamen)][vornamen]{test}
[user][nachnamen] [user][nachnamen]
[benutzer][vornamen]
[pgd][pgd_vornamen]{public}
...@@ -5,6 +5,9 @@ from psycopg2 import sql ...@@ -5,6 +5,9 @@ from psycopg2 import sql
import sys import sys
from random import randrange from random import randrange
import argparse import argparse
from psycopg2.extensions import AsIs
import re
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
...@@ -46,8 +49,7 @@ for line in replacelines: ...@@ -46,8 +49,7 @@ for line in replacelines:
elif "dbport" in parameter: elif "dbport" in parameter:
dbport = (parameter.split(' '))[1] dbport = (parameter.split(' '))[1]
if "}" in dbport: if "}" in dbport:
dbport = dbport[:-1] dbport = dbport[:-1]
elif (newline[0]) == '[': elif (newline[0]) == '[':
replacetable = (((newline.split(']'))[0]).split('['))[1] replacetable = (((newline.split(']'))[0]).split('['))[1]
if "{" in newline: if "{" in newline:
...@@ -58,6 +60,12 @@ for line in replacelines: ...@@ -58,6 +60,12 @@ for line in replacelines:
except: except:
print ("ERROR! Syntaxerror in you file [Line: " + str(linecount) + "]!") print ("ERROR! Syntaxerror in you file [Line: " + str(linecount) + "]!")
exit() exit()
else:
if "(" in oldtable:
primarykeylist = str(oldtable.split("(")[1]).split(")")[0]
oldtable = str((oldtable.split("(")[0]))
if "{" in newline: if "{" in newline:
replacementschema = (newline.split('{')[1]).split('}')[0] replacementschema = (newline.split('{')[1]).split('}')[0]
try: try:
...@@ -90,48 +98,77 @@ for line in replacelines: ...@@ -90,48 +98,77 @@ for line in replacelines:
else: else:
parameterlist = (parameterlist + " host=" + dbhost + " port=" + dbport) parameterlist = (parameterlist + " host=" + dbhost + " port=" + dbport)
# Database #
print("Connecting to: " + parameterlist)
conn = psycopg2.connect(parameterlist) conn = psycopg2.connect(parameterlist)
cur = conn.cursor() cur = conn.cursor()
try: racur = conn.cursor()
cur.execute(sql.SQL("SELECT COUNT (id) FROM {}.{}").format(sql.Identifier(replacementschema),sql.Identifier(oldtable))) selcur = conn.cursor()
anzahlbenutzer = (cur.fetchall())[0][0]
except:
error = 0
# Update original table #
try: try:
cur.execute(sql.SQL("SELECT COUNT (id) FROM {}.{}").format(sql.Identifier(replacewithschema),sql.Identifier(replacetable))) selcur.execute(sql.SQL("SELECT %s FROM {}.{}").format(sql.Identifier(replacementschema),sql.Identifier(oldtable)), (AsIs(primarykeylist), ))
anzahl = (cur.fetchall())[0][0]
except:
error = 0
counter = 1
try:
anzahlbenutzer
except: except:
error = 0 error = 0
else: else:
while counter <= anzahlbenutzer: while 1:
try: try:
cur.execute(sql.SQL("SELECT {} FROM {}.{} WHERE id = %s").format(sql.Identifier(replacetable),sql.Identifier(replacewithschema),sql.Identifier(replacetable)),(randrange(anzahl),)) user = selcur.fetchone()
except: except:
try: error = 0
print ("ERROR! The Table or column \"" + replacetable +"\" doesn't exist in the schema \"" + replacewithschema + "\" [Line: " + str(linecount - 1) + "]!") counter2 = 0
except:
print ("ERROR! You need to specify a table and a schema [Line: " + str(linecount - 1) + "]!") # random value #
finally:
exit() try:
racur.execute(sql.SQL("SELECT COUNT (id) FROM {}.{}").format(sql.Identifier(replacewithschema),sql.Identifier(replacetable)))
anzahl = (racur.fetchall())[0][0]
except:
error = 0
else: else:
value = "".join(cur.fetchall()[0]) racur.execute(sql.SQL("SELECT {} FROM {}.{} WHERE id = %s").format(sql.Identifier(replacetable),sql.Identifier(replacewithschema),sql.Identifier(replacetable)),(randrange(anzahl),))
value = "".join(racur.fetchall()[0])
# Update #
try: try:
cur.execute(sql.SQL("UPDATE {}.{} SET {} = %s WHERE id = %s").format(sql.Identifier(replacementschema),sql.Identifier(oldtable),sql.Identifier(oldcolumn)),(value,counter)) query = (sql.SQL("UPDATE {}.{} SET {} = {} WHERE {} = {}").format(sql.Identifier(replacementschema), sql.Identifier(oldtable), sql.Identifier(oldcolumn), sql.Literal(value), sql.Identifier(primarykeylist.split(",")[counter2]), sql.Literal(user[counter2])))
except: except:
print ("ERROR! The column \""+ oldcolumn +"\" inside the table \"" + oldtable +"\" doesn't exist inside the schema \"" + replacementschema + "\" [Line: " + str(linecount) + "]!") error = 0
exit() count = 1
conn.commit() while len(primarykeylist.split(",")) > (count):
counter = counter + 1 add = (sql.SQL(" AND {} = {}").format(sql.Identifier(primarykeylist.split(",")[count]), sql.Literal(user[count])))
query = query + add
cur.execute(query)
conn.commit()
count = count + 1
counter2 = counter2 + 1
try:
selcur.scroll(0,mode='relative')
except psycopg2.ProgrammingError:
break
...@@ -53,11 +53,11 @@ lines = file.readlines() ...@@ -53,11 +53,11 @@ lines = file.readlines()
file.close() file.close()
try: try:
cur.execute(sql.SQL("DROP TABLE {}").format(sql.Identifier(tablename))) cur.execute(sql.SQL("DROP TABLE {}.{}").format(sql.Identifier(schema),sql.Identifier(tablename)))
except: except:
conn.rollback() conn.rollback()
finally: finally:
cur.execute(sql.SQL("CREATE TABLE {} (id serial PRIMARY KEY, {} varchar)").format(sql.Identifier(tablename),sql.Identifier(tablename))) cur.execute(sql.SQL("CREATE TABLE {}.{} (id serial PRIMARY KEY, {} varchar)").format(sql.Identifier(schema),sql.Identifier(tablename),sql.Identifier(tablename)))
for name in lines: for name in lines:
cur.execute(sql.SQL("INSERT INTO {}.{} ({}) VALUES (%s)").format(sql.Identifier(schema),sql.Identifier(tablename),sql.Identifier(tablename)),(name[:-1], )) cur.execute(sql.SQL("INSERT INTO {}.{} ({}) VALUES (%s)").format(sql.Identifier(schema),sql.Identifier(tablename),sql.Identifier(tablename)),(name[:-1], ))
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment