Как обеспечить, чтобы Python3 выводил числа в виде строки, а не целого числа? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть строка кода здесь:

query = """SELECT v.retailiqpo_ordernumber 
    FROM public.vmi_purchase_orders v
    WHERE v.vendor_account = {}""".format(str(primary_account_number))

Я пытался загрузить в строковое значение числа, но psycopg2 по-прежнему выдает эту ошибку.

psycopg2.ProgrammingError: operator does not exist: character varying = integer

Какие опции у меня есть, чтобы Psycopg2 воспринял это как строку? Или мне просто изменить общую структуру базы данных на целые числа?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

(почти) всегда лучше позволить psycopg2 интерполировать параметры запроса для вас. (http://initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters)

query = """SELECT v.retailiqpo_ordernumber 
    FROM public.vmi_purchase_orders v
    WHERE v.vendor_account = %s"""

cur.execute(query, (str(primary_account_number),))

Таким образом psycopg2 будет иметь дело с правильным форматированием типа, основанным на типе переданного значения python.

0 голосов
/ 09 мая 2018

Использовать

query = """
SELECT v.retailiqpo_ordernumber 
FROM public.vmi_purchase_orders v 
WHERE v.vendor_account = '{}'
""".format(primary_account_number)

Таким образом, число внутри вашего запроса передается в виде строки - если ваш c.vendor_account равен типа строки (varchar ie).Важной частью являются ' до / после {}, поэтому строка запроса видит ее как строку.


Как отметил Джон Клементс, лучше, чтобы API обработал преобразование:

query = """
SELECT v.retailiqpo_ordernumber 
FROM public.vmi_purchase_orders v 
WHERE v.vendor_account = %s
"""

cursor.execute(query, (str(primary_account_number),)

Доку: Psycopg - Передача параметров в sql-запросы

...