Dựa trên mogrify()
đã cập nhật của bạn đầu ra, các chuỗi và ngày giờ của bạn dường như được diễn giải chính xác. E'foo bar'
là "hằng số chuỗi thoát" của Postgres. Nó cho phép bạn biểu diễn các chuỗi thoát kiểu C, như \t
cho tab, trong văn bản. Cũng là unknown
bạn thấy trong psycopg2.ProgrammingError
không có gì phải lo lắng, đó là hành vi bình thường. Trước tiên, bạn có thể kiểm tra xem số lượng đối số cho lệnh gọi hàm của mình có đúng không và có thể thử gọi thủ tục bằng một tham số viết tay để xác định tham số nào có thể gây ra sự cố:
Quy trình kiểm tra:
CREATE OR REPLACE FUNCTION
foo (num INTEGER, name VARCHAR, ts TIMESTAMP)
RETURNS TABLE (num INTEGER, name VARCHAR, ts TIMESTAMP)
AS $$ SELECT $1, $2, $3; $$
LANGUAGE SQL;
Ví dụ:
% python
>>> import datetime
>>> import psycopg2
>>> conn = psycopg2.connect("user=postgres")
>>> r = conn.cursor()
>>> args = [1, "hello", datetime.datetime.now()]
>>> r.callproc('foo', args)
[1, 'hello', datetime.datetime(2011, 3, 10, 18, 51, 24, 904103)]
>>> r.callproc('fooxyz', args)
psycopg2.ProgrammingError: function fooxyz(integer, unknown, unknown) does not exist
LINE 1: SELECT * FROM fooxyz(1,E'hello','2011-03-10T18:51:24.904103'...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.