halloICKEbins
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Mahlzeit, habe das nachfolgende Script und das Problem das keine Tabelle erstellt wird, obwohl die DB, der User usw. existieren. Egal wie ich das Script starten - es wird keine Tabelle in die DB geschrieben. Ziel soll es sein, das root (Ubuntu) das Script startet und die Tabelle erstellt wird! 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | # -*- coding: utf-8 -*-
#!/usr/bin/env python3
import sys
import psycopg2
conn = psycopg2.connect('dbname=testdb user=testuser host=localhost password=testpassword')
cursor = conn.cursor()
try:
cursor.execute("""CREATE TABLE testtabelle (testint integer);""")
except psycopg2.Error as e:
print (e.pgerror)
conn.close()
|
Bei Starten des Scripts mittels der Befehle kommt nachfolgende Fehlermeldung:
sudo -u postgres python3 my_script.py
bzw. direkt unter python3 in der Konsole Error in atexit._run_exitfuncs:
PermissionError: [Errno 13] Permission denied Wenn ich ein try - Exception - Block um die Verbindung lege kommt keine Fehler...Verbindung funktioniert anscheinend!?
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Ich bin nicht aus dem Hause Python, aber kann es nicht sein, dass schon | conn = psycopg2.connect('dbname=testdb user=testuser host=localhost password=testpassword')
|
schiefgeht oder
so dass das try/catch diese mit umfassen sollte? Außerdem biete ich noch die Idee auf in Postgresqls logfile zu schauen, ob da was steht.
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4578
Wohnort: Berlin
|
Ich würde die try /except ganz sein lassen wenn man da bloss weniger Informationen ausgibt als wenn eine Ausnahme ihren ”normalen” Lauf nimmt zu einem kompletten Traceback führt. Den Cursor müsste man übrigens auch schliessen, und zwar vor der Verbindung. Manche DBMS tolerieren das zwar (und manche auch nur in bestimmten Fällen) aber wenn man sauber gegen die DB API V2 programmieren will, sollte man den Cursor schliessen.
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Auch mit weglassen von try/exception ändert sich nichts...auch das nachstehende Script gibt keine Fehlermeldungen aus: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | import psycopg2
try:
connect_str = "dbname='testdb' user='testuser' host='localhost' " + \
"password='testpassword'"
# use our connection values to establish a connection
conn = psycopg2.connect(connect_str)
# create a psycopg2 cursor that can execute queries
cursor = conn.cursor()
# create a new table with a single column called "name"
cursor.execute("""CREATE TABLE tutorials (name char(40));""")
# run a SELECT statement - no data in there, but we can try it
cursor.execute("""SELECT * from tutorials""")
rows = cursor.fetchall()
print(rows)
except Exception as e:
print("Uh oh, can't connect. Invalid dbname, user or password?")
print(e)
|
Werde cursor.close() jetzt immer verwenden, aber leider klappt es damit auch nicht!
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4578
Wohnort: Berlin
|
@halloICKEbins: Das weglassen von try /except macht das Programm besser weil man im Fehlerfall innerhalb des try -Blocks mehr Informationen erhält. Die letzte Variante ist noch schlechter weil dem Benutzer „Uh oh, can't connect. Invalid dbname, user or password?“ ausgegeben wird, auch wenn zum Beispiel ein Fehler im SQL beim SELECT ist, was ja überhaupt gar nichts mit dem Verbindungsaufbau und damit Datenbank- oder Benutzername oder Passwort zu tun hat. Der Fehler taucht anscheinend beim abarbeiten der Funktionen auf, die für das beenden des Prozesses registriert sind. Allerdings finde ich in den psycopg2 -Quelltexten keine Stelle an der ein atexit -Handler registriert wird. Und es gibt keinen Traceback, ausser Du hast den manuell gelöscht bevor Du die Fehlermeldung hier gezeigt hast, was darauf hindeuten könnte das der PermissionError direkt aus dem Python-Interpreter kommt. Starte doch mal ein leeres Programm oder eines wo nur ein print("Hello") drin steht und dann füge nach und nach mehr von dem Programm hinzu und führe das jedes mal aus um die Stelle zu finden, ab der diese Ausnahme auftritt. Vielleicht klappt ja der Import schon nicht.
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Abend, habe mal das Lock angeschmissen aber dort sind keine Fehler! 2018-04-22 21:27:06.390 CEST [5903] user1@testdb LOG: statement: BEGIN
2018-04-22 21:27:06.390 CEST [5903] user1@testdb LOG: statement: CREATE TABLE hallowelt (test1 integer); Habe den nachfolgenden Quelltext verwendet und direkt in Python3 getestet: 1
2
3
4
5
6
7
8
9
10
11
12
13 | # -*- coding: utf-8 -*-
#!/usr/bin/env python3
import sys
import psycopg2
conn = psycopg2.connect('dbname=testdb user=user1 host=localhost password=meins')
cursor = conn.cursor()
cursor.execute("""CREATE TABLE hallowelt (test1 integer);""")
cursor.close()
conn.close()
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Locks gibt es auch, aber das steht für Schloss, im Sinne von Türschloss, Vorhängeschloss. Du meinst ein Log, aka Logdatei, siehe auch Logbuch.
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Meinte ich ja 😉 habe vergessen zu schreiben, dass noch nicht funktioniert
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Mit diesem Tutorials klappt es jetzt endlich - nach diversen rumprobieren mit Codeschnipseln! http://www.postgresqltutorial.com/postgresql-python/insert/
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4578
Wohnort: Berlin
|
@halloICKEbins: Und woran lag es, dass das Anlegen der Tabelle nicht funktioniert hat?
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Ich vermute zum Einen, dass die SQL-Befehle in """Befehl""" beschrieben werden müssen und zum Zweiten am chronologischen Aufbau - connect conn, execute sql, close cur, commit changes, close conn
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4578
Wohnort: Berlin
|
@halloICKEbins: Falls mit dem ersten gemeint ist das SQL-Befehle in dreifache Anführungszeichen eingefasst werden müssen — das stimmt nicht. Da kommen auch einfach nur Zeichenketten bei heraus, die von anderen nicht unterscheidbar sind.
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Aso...so weit habe ich jetzt noch nicht durchgetestet...war froh, dass es funktioniert und ich weiter machen konnte.
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5348
|
Ich vermute der Fehler war, dass die Transaktion nicht committed wurde. Im Log steht ja auch, dass das Statement ankam. Das automatische Starten von Transaktionen kann man in psycopg abstellen, siehe http://initd.org/psycopg/docs/usage.html#transactions-control
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
@sebix Danke für den Nachtrag!
|