2017-06-01 3 views
0

Ich versuche, eine gespeicherte Prozedur auszuführen, um eine Tabelle abzufragen, und habe Probleme, einen Parameter erfolgreich zu übergeben.Ausführen gespeicherter SQL Server-Prozeduren mit Parametern in Python

title=cursor.execute("SELECT titlequery(%s)", str(member_id))` 

titlequery() wird durch diese erstellt:

Ich erhalte

CREATE OR REPLACE FUNCTION public.titlequery(mid text) 
 
    RETURNS text AS 
 
$BODY$ 
 

 
SELECT title FROM Member WHERE member_id=mid; 
 

 
$BODY$ 
 
    LANGUAGE sql

Und der Fehler:

modules.pg8000.core.ProgrammingError: ('ERROR', '42P18', 'could not determine data type of parameter $2', 'postgres.c', '1356', 'exec_parse_message', '', '')

Weiß jemand, was hier passiert?

+0

Wie sieht 'member_id' aus? –

+0

Es ist ein String, wie 'A000042553' –

+0

die Abfrage sollte 'cursor.execute (" SELECT titlequery (% s) "% str (member_id))' –

Antwort

1

PEP-249 gibt API für Datenbanktreiber und pg8000 folgt dieser API als auch

pg8000 is a DB-API 2.0 compatible pure-Python interface to the PostgreSQL database engine.

Von PEP-249execute method specification:

Parameters may be provided as sequence or mapping and will be bound to variables in the operation.

Wir bei pg8000 sources ein Beispiel, wie sehen passieren zu abfragende Parameter.

Sie sollten also eine tuple/list von Werten übergeben, nicht selbst Wert.

Auch sollten wir Abfrage zuerst ausführen und dann die Ergebnisse holen fetchone oder fetchmany oder fetchall verwenden, da execute selbst None (mehr bei sources) zurückgibt. Ich denke, OP benötigt einen Datensatz, also werden wir fetchone verwenden.

Hinweis: fetchone Methode gibt Aufzeichnung als tuple dargestellt, so dass, wenn wir müssen zuerst koordinieren, dann sollten wir get it using zero index.

In Ihrem Fall sollten Sie versuchen:

parameters = (str(member_id),) # WARNING: don't miss the comma 
cursor.execute("SELECT titlequery(%s)", parameters) 
title = cursor.fetchone()[0] 

oder

parameters = [str(member_id)] 
cursor.execute("SELECT titlequery(%s)", parameters) 
title = cursor.fetchone()[0] 

Beispiel

Dieser arbeitete für mich

import pg8000 

table_definition = """ 
    CREATE TABLE Member(
    title VARCHAR(40) NOT NULL, 
    member_id VARCHAR(40) NOT NULL) 
""" 
procedure_definition = """ 
    CREATE OR REPLACE FUNCTION public.titlequery(mid text) 
    RETURNS text AS 
    $BODY$ 
    SELECT title FROM Member WHERE member_id=mid; 
    $BODY$ 
    LANGUAGE sql 
""" 

connection = pg8000.connect(database='database', 
          user='username', 
          password='password', 
          host='hostname', 
          port=5432) 
cursor = connection.cursor() 

# Preparation 
cursor.execute(table_definition) 
cursor.execute(procedure_definition) 
values = ('Information', 'A000042553') 
cursor.execute('INSERT INTO Member (title, member_id) VALUES (%s, %s)', 
       values) 

# Reading stored procedure result 
parameters = ('A000042553',) 
cursor.execute("SELECT titlequery(%s)", parameters) 
title = cursor.fetchone()[0] 
print(title) 

# Cleanup 
cursor.close() 
connection.close() 

gibt uns

Information 
+0

Danke, das hat mir geholfen. Ich bekomme jetzt das Ergebnis als '[Ergebnis]'. Woher kommen die Symbole? –

+0

@CallumVanDenHoek: bearbeitete Antwort, Sie sollten zuerst Ihre Abfrage ausführen und dann mit ['fetchone'] (https://www.python.org/dev/peps/pep-0249/#fetchone) oder [' fetchmany '] (https://www.python.org/dev/peps/pep-0249/#fetchmany) oder [' fetchall'] (https://www.python.org/dev/peps/pep-0249/#) fetchall) –

+0

@CallumVanDenHoek: abgeschlossene Antwort, hoffe es hilft –

Verwandte Themen