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