Запрос SQL возвращает пустой вывод при запуске внутри скрипта Python

1

У меня есть сценарий python, который должен пересекать текстовый файл и собирать домен в качестве аргумента из каждой строки текстового файла. Затем предполагается использовать домен в качестве аргумента в SQL-запросе. Проблема в том, что когда я передаю имя domain_name в качестве аргумента, вывод JSON, который создает сценарий, пуст. Если я устанавливаю аргумент domain_name в моем запросе sql непосредственно внутри запроса, тогда сценарий выводит идеальный формат JSON. Как вы можете видеть в верхней части моего скрипта прямо ниже def connect_to_db() Я начинаю цикл через текстовый файл. Я не уверен, где в моем коде ошибка будет происходить с помощью любой помощи.

Код

from __future__ import print_function

try:
    import psycopg2
except ImportError:
    raise ImportError('\n\033[33mpsycopg2 library missing. pip install psycopg2\033[1;m\n')
    sys.exit(1)

import re
import sys
import json
import pprint

DB_HOST = 'crt.sh'
DB_NAME = 'certwatch'
DB_USER = 'guest'


def connect_to_db():
    filepath = 'test.txt'
    with open(filepath) as fp:
        for cnt, domain_name in enumerate(fp):
            print("Line {}: {}".format(cnt, domain_name))
            print(domain_name)
            domain_name = domain_name.rstrip()

            conn = psycopg2.connect("dbname={0} user={1} host={2}".format(DB_NAME, DB_USER, DB_HOST))
            cursor = conn.cursor()
            cursor.execute(
                "SELECT c.id, x509_commonName(c.certificate), x509_issuerName(c.certificate) FROM certificate c, certificate_identity ci WHERE c.id = ci.certificate_id AND ci.name_type = 'dNSName' AND lower(ci.name_value) = lower('%s') AND x509_notAfter(c.certificate) > statement_timestamp();".format(
                    domain_name))

            unique_domains = cursor.fetchall()

        # print out the records using pretty print
        # note that the NAMES of the columns are not shown, instead just indexes.
        # for most people this isn't very useful so we'll show you how to return
        # columns as a dictionary (hash) in the next example.
            pprint.pprint(unique_domains)

            outfilepath = domain_name + ".json"
            with open(outfilepath, 'a') as outfile:
                    outfile.write(json.dumps(unique_domains, sort_keys=True, indent=4))

if __name__ == "__main__":
    connect_to_db()
  • 0
    Вы используете .format для строки sql, но в ней нет {}
  • 0
    Также плохая форма для использования format() потому что она открыта для внедрения SQL. Вы либо путаете два метода интерполяции строк (которые вы не должны использовать), либо неправильно используете заполнитель %s для параметризованного запроса.
Показать ещё 5 комментариев
Теги:
python-3.x

1 ответ

2

Не используйте формат для создания инструкции SQL. Использовать? заполнители, а затем кортеж значений для вставки:

c.execute('''SELECT c.id, x509_commonName(c.certificate), 
    x509_issuerName(c.certificate) FROM certificate c, certificate_identity ci WHERE 
    c.id= ci.certificate_id AND ci.name_type = 'dNSName' AND lower(ci.name_value) = 
    lower(?) AND x509_notAfter(c.certificate) > statement_timestamp()''',(domain_name,))

В более общем виде:

c.execute('''SELECT columnX FROM tableA where columnY = ? AND columnZ =?'''
    (desired_columnY_value,desired_columnZ_value))
  • 0
    @roganjosh какая часть не так? это выглядит нормально для меня
  • 0
    @roganjosh ах, теперь я вижу dNSName , ты прав. Но почему """ против ''' ? "Они одинаковы с питоном?
Показать ещё 11 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню