为了账号安全,请及时绑定邮箱和手机立即绑定

处理文本文件中的单引号

处理文本文件中的单引号

心有法竹 2023-04-18 15:48:08
我有一个纯文本文件,由~20-07-31-03:00~[*IF *VALUE *EQ 'DB_CONTENT'  *UNTIL]下面的脚本接收损坏的数组如下with open('''/etc/files/plaintext.txt''') as f:    resultCollect = f.read().splitlines()     resultSplit.append([line.split('~') for line in resultCollect])    insert(resultSplit[0], table)# resultSplit[0] --> ['20-07-31-03:00','[*IF *VALUE *EQ 'DB_CONTENT'  *UNTIL]']def insert(data, table):    val = [tuple(line) for line in data]    for i in range(len(val)):        cur.execute("""INSERT INTO {0} VALUES {1}""".format(table, tuple(val[i])))但是,由于 中的字符串内有单引号'DB_CONTENT',在尝试向数据库中插入时,会产生以下错误column "[*IF *VALUE *EQ 'DB_CONTENT'  *UNTIL]" does not exist生成的插入示例INSERT INTO tbl_details VALUES ('20-07-30-01:53', "[*IF *VALUE *EQ 'DB_CONTENT'  *UNTIL]")可重现的例子:result = []val = '''20-07-31-03:00~[*IF *VALUE *EQ 'DB_CONTENT'  *UNTIL]'''result.append([val.split('~')])def insert(data, table):  val = [tuple(line) for line in data]  for i in range(len(val)):    print("""INSERT INTO {0} VALUES {1}""".format(table, tuple(val[i])))insert(result[0], 'tbl_name')任何解决方案的建议?
查看完整描述

1 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

你永远不应该自己格式化 SQL 查询:

永远,永远,永远不要使用 Python 字符串连接 (+) 或字符串参数插值 (%) 将变量传递给 SQL 查询字符串。甚至没有在枪口下。


从文档示例中可以看出,首选方法是让库处理它。


SQL = "INSERT INTO authors (name) VALUES (%s);" # Note: no quotes

data = ("O'Reilly", )

cur.execute(SQL, data) # Note: no % operator

这应该可以正确处理用单引号转义您的字符串。


编辑:在您的代码中添加示例。上面建议的方式不应该用于插入表名(INSERT INTO %s),它应该只用于数据部分(VALUES (%s))


EDIT2:没有注意到你想插入两个值'20-07-30-01:53', "[*IF *VALUE *EQ 'DB_CONTENT'  *UNTIL]"。我已经编辑了代码,请注意%s查询字符串中的附加内容。此外,我真的看不出val[i]包含什么,但它应该是您要插入的两个值的序列(元组、列表)。


from psycopg2.sql import SQL, Identifier



SQL_QUERY_STRING = """INSERT INTO {} VALUES (%s, %s)"""



def insert(data, table):

    val = [tuple(line) for line in data]

    for i in range(len(val)):

        curr.execute(

            SQL(SQL_QUERY_STRING).format(Identifier(table)),

            val[i],

            # second (data) argument has to be a sequene (tuple, list, ...)

            # of values to be inserted, even if it's just one value

        )


查看完整回答
反对 回复 2023-04-18
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信