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

Variables (assigned from CLI arguments) not recognized in SQL query

我正在尝试编写代码,在命令提示符中输入姓名和电子邮件后,它应该更新 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 了。

我在这里错过了什么?明明跟怎么加引号有关,但是我找不到正确的方法..

您需要为 所有 位置的占位符替换参数化数据 - 因此不仅 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,))