在SQL查询中无法识别变量(从CLI参数分配)

时间:2018-06-13 13:19:11

标签: python postgresql command-prompt

我尝试编写代码,在命令提示符中输入名称和电子邮件后,它应该更新Postgres数据库中的数据。英语不是我的第一语言,但我会尽力描述我的情况。

所以基本上在输入cmd:

 python myProgram.py jacob8 jacob8@company.com

它应该更新用户名栏中的jacob8和电子邮件栏中的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 :(得分:2)

您需要使用所有位置的占位符来替换参数化数据 - 不仅仅是mac,还有userNameeMail

就个人而言,为了便于阅读,我将其写为只进行两次更新的查询,如下所示:

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,))