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
Wie sieht 'member_id' aus? –
Es ist ein String, wie 'A000042553' –
die Abfrage sollte 'cursor.execute (" SELECT titlequery (% s) "% str (member_id))' –