psycopg2 在执行语句中抱怨文本 : 和 amazonaws

psycopg2 complaining about text : and amazonaws in execute statement

相当烦人,不知道如何修复,但这是我的 psycopg2 代码。它在 lambda 函数上 运行。

conn = psycopg2.connect(
            host='nope',
            database='nope',
            user='nope',
            password='nope'
        )
        cur = conn.cursor()
        url = "https://nope.s3.us-east-2.amazonaws.com/" + str(rawbucketkey)
        cur.execute('''
                    UPDATE contentcreatorcontentfeedposts_contentfeedpost
                    SET picturemediatype = TRUE, mediakey = ''' + str(rawbucketkey) + ''',
                    mediaurl=''' + url + ''',
                    active = TRUE, postsubmit = FALSE
                        WHERE contentcreator = ''' + userid + '''AND
                        id =''' + contentpostid + ''';
                        COMMIT;
                            ''')
        cur.close()

看看这一行 mediaurl=''' + url + ''',url就是上面代码中提到的:

url = "https://nope.s3.us-east-2.amazonaws.com/" + str(rawbucketkey)

我得到 syntaxError 语句,它指向 :amazonaws 这一行中的文本 url = "https://nope.s3.us-east-2.amazonaws.com/" + str(rawbucketkey)

我不知道为什么。这是让我想停止编码并住在山区的问题类型=(帮助为什么会发生这种情况?

这里是准确的错误信息

[ERROR] SyntaxError: syntax error at or near "amazonaws"
LINE 4: ...           mediaurl=https//shofi-mod.s3.us-east-2.amazonaws....
                                                             ^

Traceback (most recent call last):
  File "/var/task/lambdarunner.py", line 154, in lambda_handler
    cur.execute('''

将参数作为字符串插入到您的SQL中是very bad security。你应该传递参数以确保没有SQL注入。

您的问题可能可以通过将您的语句用双引号引起来解决,而不是使用 3 个单引号:

    cur.execute("
                UPDATE contentcreatorcontentfeedposts_contentfeedpost
                SET picturemediatype = TRUE, mediakey = '" + str(rawbucketkey) + "',
                mediaurl='" + url + "',
                active = TRUE, postsubmit = FALSE
                    WHERE contentcreator = '" + userid + "' AND
                    id = '" + contentpostid + "';
                    COMMIT;
                ")

或者,您可以使用 Python f 字符串:

    cur.execute(f"
                UPDATE contentcreatorcontentfeedposts_contentfeedpost
                SET picturemediatype = TRUE, mediakey = '{str(rawbucketkey)}',
                mediaurl='{url}',
                active = TRUE, postsubmit = FALSE
                    WHERE contentcreator = '{userid}' AND
                    id ='{contentpostid}';
                    COMMIT;
                ")

但是,请研究传递参数的正确方法,否则您的应用很可能被黑客入侵。