отправка DICT None в SQL Null - PullRequest
       1

отправка DICT None в SQL Null

0 голосов
/ 03 марта 2019

У меня есть этот кусок кода:

def get_summary_data(self):
    summary_data = self.page_data.find('table', {'class': 'GroupBox1'})
    record = {}
    rows = summary_data.findAll('tr')
    for row in rows:
        fields = row.findAll('td')
        for field in fields:
            key = field.find(text=True, recursive=False).strip()
            value = field.find('strong').text.strip() if field.find('strong') else None
            value = value if value else None
            if key != '':
                record[self.configuration[key]] = value
    ins_qry = "INSERT INTO {tablename} ({columns}) VALUES {values};".format(
        tablename='rrc_completion_data.summarydata',
        columns=', '.join(record.keys()),
        values=tuple(record.values())
    )
    self.engine.execute(ins_qry)

Этот запрос выглядит следующим образом:

INSERT INTO rrc_completion_data.summarydata (Track_No, Status, Operator_Nm, Compl_Type, Field_Nm, Completion_Dt, Lease_Nm, Filing_Purpose, District_No, Well_Type, LeaseNo, County, Well_No, WellBore_Profile, API, WB_Compl_Type, DrilL_Permit_No, SL_Parent_Drill_Permit_No, Field_No, Horiz_Depth_Severance) VALUES ('2928', 'Work in Progress', 'WILLIAMS PROD. GULF COAST, L.P. (924558)', 'New Well', 'NEWARK, EAST (BARNETT SHALE)', '05/17/2010', 'DR. BOB SMITH A NORTH', 'Initial Potential', '09', 'Producing', None, 'DENTON', '10H', 'HORIZONTAL', '42-121-33861', None, '687311', None, '65280200', None);

Как видите, есть значения None, которые япытаясь использовать в качестве нулей.но приводит к этой ошибке:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) column "none" does not exist
LINE 1: ...A NORTH', 'Initial Potential', '09', 'Producing', None, 'DEN...

Чего мне не хватает?Мое намерение состоит в том, чтобы иметь нулевые значения в таблице базы данных, где None существует.

Спасибо

1 Ответ

0 голосов
/ 03 марта 2019

Источником ваших проблем является использование строкового форматирования для передачи значений в SQL-запрос. Никогда не делай этого.Помимо прочего, он подвергает вас внедрению SQL-кода.Кажется, что вы вносите белый список в столбцы, что хорошо, но затем передаете значения, заключенные в Python tuple, и полагаете, что строковое представление совпадает с представлением конструкции строки SQL - что не является истинным, как это уже можно увидеть с помощьюNone значения.Другим источником проблем могут быть строки, содержащие символ '.

Вместо этого следует использовать заполнители в строке запроса и позволить своим библиотекам обрабатывать передачу значений в SQL:

columns = list(record.keys())
ins_qry = "INSERT INTO rrc_completion_data.summarydata ({columns}) VALUES ({placeholders})".format(
    columns=', '.join(columns),
    placeholders=', '.join([':' + c for c in columns])
)
self.engine.execute(text(ins_qry), record)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...