Переменные (назначенные из аргументов CLI) не распознаются в запросе SQL - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь написать код, в котором после ввода имени и адреса электронной почты в командной строке следует обновить данные в базе данных Postgres.Английский не мой родной язык, но я буду стараться изо всех сил описать мою ситуацию.

Так что в основном при вводе cmd:

 python myProgram.py jacob8 jacob8@company.com

Это должно обновить jacob8 в имени пользователяcolumn и jacob8@company.com в столбце электронной почты.

Итак, мой код такой:

import sys
import psycopg2

conn = psycopg2.connect("user=nana password=nana dbname=nana host=localhost")
cur = conn.cursor()

userName = str(sys.argv[1])
eMail = str(sys.argv[2])
cur.execute('UPDATE "table" SET "user_name" = userName WHERE "address"=%s', (mac,))
cur.execute('UPDATE "table" SET "user_email" = eMail WHERE "address"=%s', (mac,))
conn.commit()

... но по какой-то причине userName, который я использую, где я 'Я пытаюсь установить, не распознает имя пользователя, которое я назначил как sys.argv[1], и то же самое относится и к eMail.Когда я добавляю их в одинарные кавычки, он распознается, но портит (делает зеленую остальную часть строки) остальной частью строки, начинающейся с WHERE.

Я также пытался поставить sys.argv[1]и sys.argv[2] прямо в строку SET (например, UPDATE "table" SET "user_name" = sys.argv[1] WHERE), но это доставляет мне такую ​​же проблему - он больше не распознает import sys.

Что мне здесь не хватает?Это явно связано с тем, как добавить кавычки, но я не могу найти правильный путь ..

1 Ответ

0 голосов
/ 13 июня 2018

Вам понадобятся заполнители для всех местоположений, где вы хотите заменить параметризованные данные - не только mac, но также userName и eMail.

Лично дляРади читабельности, я бы написал это как один запрос, выполняющий оба обновления, следующим образом:

query = '
UPDATE table
SET user_name = %(name)s, user_email = %(email)s
WHERE address = %(mac)s
'
cur.execute(query, {'name': userName, 'email': eMail, 'mac': mac})

При этом самое короткое возможное изменение - просто:

cur.execute('UPDATE "table" SET "user_name" = %s WHERE "address"=%s', (userName, mac,))
cur.execute('UPDATE "table" SET "user_email" = %s WHERE "address"=%s', (eMail, mac,))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...