如何将 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 中进行 UPSERT(合并、插入……重复更新)?