data = ""
for row in self.read(file):
counter += 1
data = data + self.parse(row, table_name, file)
if (counter % 10) == 0:
try:
with pg().connect(self.source_db) as conn:
conn.execute(
f"""INSERT INTO "clients" VALUES {data} ON CONFLICT ON CONSTRAINT "unique_clients" DO NOTHING;""")
except Exception as e:
self.write_log(
f"Error: {e} when parcing row: {row}", level='error')
raise Exception
data = ""
Кто может подсказать в чем косяк? Значения в бд не добавляются, выводил в print(data) данные есть.
не используй f-string в запросах к БД
f строки действительно могут набедокурить если речь идет о следующих моментах: - данные которые ты отправляешь в фстринг пришли напрямую с АПИ(или тип того) - передаешь id для WHERE - Полностью запрос в f строке. ... Но важно понимать что ситуации бывают разные и если понимаешь моменты в которых может произойти факап. то F строки в запросах использовать можно:)
1. отличная идея в цикле создавать подключения к БД 2. отличная идея не делать commit 3. отличная идея делать raise Exception вместо raise 4. отличная идея использовать f-строки с какой-то дичью в запросе, вместо безопасных подстановок через ? 5. убери on conflict, может дело в нем
я бы на уровне женевской конвенции запретил f-строки для использования в SQL
2. там же обычно автокомит стоит в контенстном менеджере!?
https://peps.python.org/pep-0675/
только на этапе проверки типов
Так и нормально
в позавчерашней бетке уже реализовано
Обсуждают сегодня