我尝试编写代码,在命令提示符中输入名称和电子邮件后,它应该更新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
了。
我在这里缺少什么?它显然与如何添加引号有关,但我无法找到正确的方法..
答案 0 :(得分:2)
您需要使用所有位置的占位符来替换参数化数据 - 不仅仅是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,))