如何将 HTML 作为 PostgreSQL 插入查询中的值处理?

Posted

技术标签:

【中文标题】如何将 HTML 作为 PostgreSQL 插入查询中的值处理?【英文标题】:How to handle HTML as a value in an PostgreSQL insert query? 【发布时间】:2019-10-28 06:41:13 【问题描述】:

我有一个包含许多列的 Pandas DataFrame,其中一列是包含 html 网页的“值”。我正在对 DataFrame 的每一行进行 Upsert 查询,但出现以下错误:

我已尝试使用以下方法转义 HTML:

    df.value = df.value.apply(lambda x: re.escape(x)) df.value = df.value.apply(lambda x: mysqldb.escape_string(x))

这是我的功能:

non_key_cols = df.columns.tolist()
    non_key_cols.remove(primary_key)

#    df.value = df.value.apply(lambda x: re.escape(x))    
    df.value = df.value.apply(lambda x: MySQLdb.escape_string(x))

    enclose_with_quote = [True if type_name.name=='object' else False for type_name in df.dtypes]
    all_cols = df.columns.tolist()
    #enclose df columns in inverted commas
    for i in range(len(enclose_with_quote)):
        if enclose_with_quote[i]:
            df[all_cols[i]] = df[all_cols[i]].apply(lambda x: '"' + x + '"')
        else:
            df[all_cols[i]] = df[all_cols[i]].apply(lambda x: str(x))


    sql = "INSERT INTO " \
    + tablename \
    + "(" + ", ".join([col for col in df.columns]) + ")" \
    + " VALUES " \
    + ", ".join(["(" + ", ".join(list(row)) + ")" for row in df.itertuples(index=False, name=None)]) \
    + " ON CONFLICT (" + primary_key + ") DO UPDATE SET " \
    + ", ".join([col + "=EXCLUDED." + col for col in non_key_cols])

    conn = _getpostgres_connection()
    cur = conn.cursor()
    cur.execute(sql)
    cur.close()
    conn.commit()
    conn.close()

这是我得到的错误:

 ProgrammingError: syntax error at or near "margin" LINE 1:
 ...t_of_nums_not_in_table_regex) VALUES ("<p style=\"margin: 0p...

【问题讨论】:

这是postgresql还是mysql?在任何一种情况下,您都不应该连接自己的值,因为它非常不安全。使用参数化查询。 它是 Postgresql。我将研究参数化查询。虽然您知道如何转义 HTML 吗?使用 MySQLdb.escape_string(x),我能够为我的类似 MySQL 项目做事 不要自己转义 HTML。使用参数化查询,它应该为您处理转义。 【参考方案1】:

在双引号内写字符串的问题。在 Postgres 中,双引号表示列/表名。您必须对字符串使用单引号。

if enclose_with_quote[i]:
        df[all_cols[i]] = df[all_cols[i]].apply(lambda x: "'" + x + "'")

话虽如此,如果您的字符串包含单引号,您将收到错误消息。最安全且最简单的方法是使用参数化查询,它将自行处理转义的引号。否则,请查看此 post 以了解如何使用自定义字符串分隔符。

【讨论】:

以上是关于如何将 HTML 作为 PostgreSQL 插入查询中的值处理?的主要内容,如果未能解决你的问题,请参考以下文章

如何加快 PostgreSQL 中的插入性能

如何将包含'的字符串保存到PostgreSQL中

如何将数组项插入 PostgreSQL 表

如何在 PostgreSQL 中进行 UPSERT(合并、插入……重复更新)?

如何使用 Pscycopg2 将字典插入 Postgresql 表

PostgreSQL - 如何将 Base64 图像字符串插入 BYTEA 列?