ich wollte mal ein wenig mit beidem, PostgreSQL und Python, herumspielen und habe mir dabei ein nonsense-Scriptchen gebaut. Dieses soll nichts weiter tun, als einen zufälligen String aus Uppercase, Lowercase, Zahlen und Punktierungszeichen zwischen 1 und 255 Zeichen Länge zu erzeugen und das ganze in eine PostgreSQL Datenbank folgender Struktur eintragen:
Code: Alles auswählen
CREATE TABLE rainbow (
value text NOT NULL,
md5_hash character(33) NOT NULL,
"time" timestamp with time zone DEFAULT now() NOT NULL
);
ALTER TABLE ONLY rainbow
ADD CONSTRAINT rainbow_pkey PRIMARY KEY (value, md5_hash);
ALTER TABLE ONLY rainbow
ADD CONSTRAINT rainbow_value_key UNIQUE (value);
Hierzu folgender Python Code:
Code: Alles auswählen
#!/usr/bin/env python3
import psycopg2
import random
import string
import sys
def randomword(length):
return ''.join(random.choice(string.ascii_letters + string.digits + string.punctuation) for i in range(length))
def insertdata(num=10, max=1000):
try:
random.seed()
conn = psycopg2.connect(database='rainbow1', user='rainbow1_user', password='passwort_0815', host='localhost')
cur = conn.cursor()
cur.execute("SET TIME ZONE 'Europe/Berlin';")
rowcount = 0
for i in range(num):
val = randomword(random.randint(1, 255))
cur.execute("SELECT * FROM rainbow WHERE value = %s;", val)
print("Hello")
if not i == 0 and not i % max:
conn.commit()
finally:
conn.commit()
cur.close()
conn.close()
try:
count = int(sys.argv[1]) - insertdata(int(sys.argv[1]))
except IndexError:
count = 10 - insertdata()
Ich habe in meiner IDE (PyCharm) einen Breakpoint auf die Zeile mit "print("Hello")" gesetzt und den Debugger angeworfen. Die Zeile, sowie alle folgenden scheinen übersprungen zu werden und es wird gleich in die "finally" Routine eingestiegen.
Das verstehe ich nicht so ganz ... das sollte doch nur passieren, wenn es bei der Ausführung des SELECTS in der Zeile zuvor zu einem Fehler kommt, oder? Allerdings kann ich da keinen Fehler entdecken. Der Code ist an der Stelle doch eigentlich nahezu 1:1 der ganz oben auf der Dokuseite von psycopg2: http://initd.org/psycopg/docs/usage.html :
Code: Alles auswählen
>>> import psycopg2
# Connect to an existing database
>>> conn = psycopg2.connect("dbname=test user=postgres")
# Open a cursor to perform database operations
>>> cur = conn.cursor()
# Execute a command: this creates a new table
>>> cur.execute("CREATE TABLE test (id serial PRIMARY KEY, num integer, data varchar);")
# Pass data to fill a query placeholders and let Psycopg perform
# the correct conversion (no more SQL injections!)
>>> cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)",
... (100, "abc'def"))
Kann mir da einer helfen?
PS:
Ich habe mir mal mit einer except Anweisung den Fehler ausgeben lassen, verstehe aber auch da nicht ganz was passiert:
Code: Alles auswählen
(<class 'TypeError'>, TypeError('not all arguments converted during string formatting',), <traceback object at 0x7f8706898388>)