Psycopg2 In Tabelle mit Platzhaltern einfügen

8

Das könnte eine ziemlich dumme Frage sein, aber was mache ich hier falsch? Es erstellt die Tabelle, aber die INSERT INTO funktioniert nicht, ich denke, ich mache etwas falsch mit den Platzhaltern?

%Vor%

Der INSERT INTO-Aufruf funktioniert nicht, es gibt mir

%Vor%

Kann mir hier jemand helfen? Vielen Dank!

    
Timothy Dalton 07.10.2013, 22:11
quelle

2 Antworten

17
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ qstntxt ___

Das könnte eine ziemlich dumme Frage sein, aber was mache ich hier falsch? Es erstellt die Tabelle, aber die INSERT INTO funktioniert nicht, ich denke, ich mache etwas falsch mit den Platzhaltern?

%Vor%

Der INSERT INTO-Aufruf funktioniert nicht, es gibt mir

%Vor%

Kann mir hier jemand helfen? Vielen Dank!

    
___ answer44446298 ___

Ab execute() gibt es eine unterstützte Möglichkeit: siehe escaped_name docs .

    
___ qstnhdr ___ Psycopg2 In Tabelle mit Platzhaltern einfügen ___ tag123postgresql ___ PostgreSQL ist ein Open-Source-Objektrelationales Datenbankverwaltungssystem (ORDBMS), das für alle wichtigen Plattformen einschließlich Linux, UNIX, Windows und OS X verfügbar ist. Bitte geben Sie Ihre genaue Version von Postgres an, wenn Sie Fragen stellen. Fragen zur Administration oder erweiterten Funktionen richten Sie am besten auf dba.stackexchange.com. ___ tag123psycopg2 ___ Psycopg ist ein PostgreSQL-Adapter für die Python-Programmiersprache. Es implementiert PEP 249 mit vielen Erweiterungen. ___ antwort19235869 ___

Sie verwenden Python-String-Formatierung und dies ist eine sehr schlechte Idee (TM). Denken Sie an SQL-Injektion. Der richtige Weg ist, gebundene Variablen zu verwenden:

%Vor%

wobei das Tupel der Parameter als zweites Argument für escaped_name angegeben wird. Auch müssen Sie keinen Wert entgehen, psycopg2 wird die Flucht für Sie tun. In diesem speziellen Fall wird auch vorgeschlagen, den Tabellennamen nicht in einer Variablen ( % ) zu übergeben, sondern in die Abfragezeichenfolge einzubetten: psycopg2 weiß nicht, wie man Tabellen- und Spaltennamen, nur Werte, zitiert.

Siehe psycopg2-Dokumentation:

Ссылка

Wenn Sie die SQL-Anweisung programmgesteuert generieren möchten, verwenden Sie die Python-Formatierung für die Anweisung und die Variablenbindung für die Argumente. Wenn Sie beispielsweise den Tabellennamen in escaped_name haben, können Sie Folgendes tun:

%Vor%

Um Platzhalter in Ihrer Abfrage zu verwenden, müssen Sie natürlich %code% angeben, die ein gebundenes Argument im ersten Format einführen.

Beachten Sie, dass dies sicher ist genau dann, wenn %code% von Ihrem Code generiert wird, der eine externe Eingabe ignoriert (z. B. einen Tabellenbasisnamen und einen Zähler), aber SQL-Injection riskiert wenn Sie die vom Benutzer bereitgestellten Daten verwenden.

    
___ tag123postgis ___ Verwenden Sie dieses Tag für PostGIS ist eine räumliche Datenbankerweiterung für PostgreSQL. Bevor Sie dieses Tag verwenden, sollten Sie überlegen, ob Ihre Frage besser für die Stack Exchange-Site von Geographic Information Systems geeignet ist (z. B. wenn es mehr um Konfigurations- oder geodätische Prinzipien als um tatsächliche Programmierung geht). ___ tag123psycopg ___ Psycopg ist ein beliebter PostgreSQL-Adapter für die Python-Programmiersprache. Im Kern implementiert es vollständig die Spezifikationen der Python DB API 2.0. Mehrere Erweiterungen ermöglichen den Zugriff auf viele der von PostgreSQL angebotenen Funktionen. ___
fog 07.10.2013, 22:27
quelle
2

Ab psycopg2 v2.7 gibt es eine unterstützte Möglichkeit: siehe psycopg2.sql docs .

    
Matt 08.06.2017 22:05
quelle