Ошибка запроса при попытке ВЫБРАТЬ данные в PostgreSQL 10 - PullRequest
0 голосов
/ 11 января 2019

Я только начинаю работать с PostgreSQL, и у меня возникла небольшая проблема. Я использую Psycopg2 и размещаю базу данных PostgreSQL на AWS RDS. Вот запрос, который я пытаюсь выполнить:

cursor.execute('SELECT id FROM fqdn AS domain WHERE domain.fqdn IS {0}'.format(fqdn_str))

fqdn_str - это доменное имя, подобное этому:

https://www.example.com

и таблица fqdn такая:

CREATE TABLE fqdn (
    id SERIAL PRIMARY KEY,
    fqdn TEXT NOT NULL,
    date_last_crawled TIMESTAMP WITH TIME ZONE NOT NULL,
        UNIQUE (fqdn)
);

Я получаю следующую ошибку:

psycopg2.ProgrammingError: syntax error at or near "https"

Я понятия не имею, что я делаю неправильно, поэтому буду признателен за помощь. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Спасибо.

Edit:

Если я изменяю строку формата на% s, как показано в документации, я получаю следующую ошибку:

TypeError: not all arguments converted during string formatting

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Как предложил пользователь @SahapAsci в комментарии к вопросу, вы должны использовать параметры для своего SQL-запроса (см. docs ), чтобы избежать уязвимостей в SQL-инъекциях.

Документы, которые я связал, даже имеют приятное примечание:

enter image description here

Но я подозреваю, что код @SahapAsci, предложенный в их комментарии, содержит небольшую ошибку. Пользователь предложил этот код:

cursor.execute(
    'SELECT id FROM fqdn AS domain WHERE domain.fqdn IS %s',
    (fqdn_str)) 

Но я думаю, что вам нужно добавить запятую в кортеж параметров, потому что в противном случае это будет не кортеж, а всего лишь одна строка, которая будет интерпретироваться как итеративная и использовать только первый символ (и затем выбрасывать ошибка, которую вы упомянули: "TypeError: not all arguments converted during string formatting"). В документах, на которые я ссылаюсь, даже есть примечание, чтобы быть осторожным в этом конкретном случае.

И вам, вероятно, следует использовать = вместо IS, но я не совсем уверен в этой последней части.

Итак, ваш окончательный код должен выглядеть примерно так:

cursor.execute(
    'SELECT id FROM fqdn AS domain WHERE domain.fqdn = %s',
    (fqdn_str, )) 
0 голосов
/ 11 января 2019

Измените IS на = в предложении WHERE.

CREATE TABLE T(ID text);
INSERT INTO T VALUES ('https://www.example.com');
SELECT * FROM T WHERE ID IS 'https://www.example.com';

ОШИБКА: синтаксическая ошибка в или около "'https://www.example.com'"
ЛИНИЯ 1: ВЫБРАТЬ * ИЗ Т, ГД ИДЕНТИФИКАТОР 'https://www.example.com';

SELECT * FROM T WHERE ID = 'https://www.example.com';
| id                      |
| :---------------------- |
| https://www.example.com |

дБ <> скрипка здесь

...