转义单引号和双引号

我正在使用Python程序来插入 /更新文本数据 PostgreSQL数据库. 文本中有单语和双引号,我 Wonder:在Python中最简单的逃脱行情的方法是什么,类似于 Perlism" $ str = 〜s/(['""])/\\ $ 1/g;"? 我尝试了re.escape()方法,但它逃脱了太多,包括 空间和重音字符. 我只想逃脱单身和双人 引号,数据库应该可以接受的所有内容. - - Leif Bibberg Kristensen http://solumslekt.org/

# 回答1

>我正在使用Python程序来插入 /更新文本数据 使用Python DB-API时,您无需逃脱文字. DB-API将为您做所有事情. 例如: sql ='插入temp data =%s' C. execute(sql,"""包含'和`以及所有其他内容的文本 从网络中阅读"") 您会看到,SQL字符串包含一个%的占位符,但执行 简单的字符串扩展SQL%""" ....""",我称为执行方法 文本为第二个 *parametar *. 其他一切都是魔术:). - - damjan
# 回答2

嘿, str.replace('"','\\").替换("'"," \\'") hth,jbar
# 回答3

Damjan Skrev: 当然,但是如果您需要多个占位符,这是否有效? FWIW, 这是整个脚本. 它将从表Name_parts获取数据 并将它们泵入"不符合"的桌子名称(真正的SQL Guru 一个怪物查询可能会做同样的事情): 导入psycopg 来自Re Import Escape 连接= psycopg.connect(" dbname = slekta",serialize = 0) sql = connection.cursor() sql.execute(" select * from name_parts") 结果= sql.fetchall() 对于结果: 如果行[2] == 1:#名称part ='prefix' query =("更新名称set prefix ='%s'其中name_id =%s"%\ (逃脱(行[4]),行[1]))) elif row [2] == 2:#名称part ='给定' query =("更新名称设置给定='%s'其中name_id =%s"%\ (逃脱(行[4]),行[1]))) elif row [2] == 3:#名称part ='surname' query =("更新名称set sere serm ='%s'其中name_id =%s"%\ (逃脱(行[4]),行[1]))) elif行[2] == 4:#名称part ='后缀' query =("更新名称set fasdix ='%s'其中name_id =%s"%\ (逃脱(行[4]),行[1]))) elif row [2] == 5:#名称part ='pathonyny' query =("更新名称设置patryny ='%s'其中name_id =%s"%\ (逃脱(行[4]),行[1]))) elif row [2] == 6:#名称part ='toponyn' query =("更新名称set topynypony ='%s'其中name_id =%s"%\ (逃脱(行[4]),行[1]))) sql.execute(查询) sql.commit() connection.close() - - Leif Bibberg Kristensen http://solumslekt.org/
# 回答4

Leif B. Kristensen写道: 当然,但是如果您需要多个占位符,这是否有效? 是的. FWIW,这是整个脚本. 它将从表名称_parts获取数据,然后将它们泵入"非正式化"表名称(真正的SQL Guru可能会在一个怪物查询中做同样的事情): 导入psycopg 来自Re Import Escape 连接= psycopg.connect(" dbname = slekta) ",序列化= 0) 光标= Connection.Cursor() cursor.execute(" select * select * from name_parts") 结果= cursor.fetchall() kint ='prefix','给定','sunname','suplix','patryom','topynym' 对于结果: 如果0 <行[2] <= 6: cursor.execute("更新名称set" + kint [row [2] -1] + " name_id =%s"," =%s", (行[4],行[1])) cursor.commit() connection.close() 1)我更喜欢" select name_id,part,name name_parts",而不是 而不是依靠 *以预期的顺序返回字段名称 随着数据库的发展,大小. 我通常在 稍后阅读代码的人的所有限额作为文档. 2)我怀疑第二次执行的最后一行可能需要: [(ROW [4],ROW [1])]))) 我真的不记得了; 我只是尝试两者,看看哪个有效. 3)何时何时要进行提交并不清楚. 我可能很想用" by name_id"进行第一个查询 并在每个不同的名称_id完成后进行提交. 这个 策略将使个人的数据保持一致. 4)实际上,我将数据放在数据库中. 也许更像 一组查询,例如: 更新名称 set name.prefix = name_parts.name 来自name_parts where names.name_id = name_parts.name_id and name_parts.name_kind = 1 当您采用此策略时,您确实需要考虑提交. - 斯科特·戴维·丹尼尔斯(Scott David Daniels) 在中,Leif B. Kristensen写道: 是的,它可以与多个占位持有人一起使用. FWIW,这是整个脚本. 它将从表Name_parts获取数据,然后将它们泵入"非正式化"表名称(一个真正的SQL Guru可能会使用一个怪物查询来执行相同的操作):import import psycopg从re import eccement Connection = psycopg.connect(dbname) = slekta",serialize = 0)sql = connection.cursor()sql.execute(" select * from name_parts")result = sql.fetchall()for RELES结果中的行:如果行[2] == 1:#名称part part ='prefix'query =(" update name sot prefix ='%s'其中name_id =%s"%\(recave(row [4]),行[1]))elif row [2] == 2:## 名称part ='给定'query =("更新名称设置给定='%s'其中name_id =%s"%\(逃脱(row [4]),行[1]))elif row [2] == 3 :#name part ='surname'query =("更新名称set seet sere sername ='%s'其中name_id =%s"%\(recave(row [4]),row [1]))elif row [2] = = 4:#名称part ='后缀'query =(" update name set sere faceix ='%s'其中name_id =%s"%\ (逃脱(行[4]),行[1]))elif row [2] == 5:#名称part ='patonyny'query =(" update naste seet set pat patryny ='%s'where name_id =%s" %\(逃脱(row [4]),行[1]))elif row [2] == 6:#name part ='toponym'query =("更新名称set seet set topynym ='%s'其中name_id =% s"%\(recave(row [4]),行[1]))sql.execute(query)sql.commit()connection.close() 许多冗余代码. 尝试类似的东西 以下而不是 ``Elif'sequence :: name_part = ['prefix','给定','sunname','suplix','patryny','topynym'] 对于结果: query ='更新名称设置%s = %% s where name_id = %% s'%name_part [row [2] -1] sql.execute(QUERY,(ROW [4],ROW [1])) sql.commit() 再见, marc'blackjack'rintsch
# 回答5

首先,感谢所有回答的人. 我学到的比我多得多 预期的 :-) 这是主要项目的一小部分; 转换我的家谱 从商业FoxPro应用程序到我的本地python的数据库 / PostgreSQL应用. 我仍在尝试 不同的模型,因此需要在两个表之间进行洗牌数据. 现在,以其精制形式的脚本看起来像这样: #! /usr/bin/env Python #name_convert.py-填充" name_parts"值的"名称" 导入psycopg name_part =('prefix','给定','sunname','suplix','patonynym','t op nomy') 连接= psycopg.connect(" dbname = slekta",serialize = 0) sql = connection.cursor() sql.execute(" select name_id,name_part_type,name_part from name_parts") 结果= sql.fetchall() 对于结果: query ="更新名称设置%s = %% s,其中name_id = %% s"%\ name_part [row [1] -1] sql.execute(QUERY,(ROW [2],行[0]))) sql.commit() connection.close() - - Leif Bibberg Kristensen http://solumslekt.org/
# 回答6

Leif B. Kristensen写道: 只是为了记录(即使这不是解决问题的正确解决方案),python等效是 re.sub('''(['""])''',r'\\\ 1',s) 肯特

标签: python

添加新评论