使用 SQLAlchemy 转义文件路径中的特殊字符

Posted

技术标签:

【中文标题】使用 SQLAlchemy 转义文件路径中的特殊字符【英文标题】:Escaping special characters in filepaths using SQLAlchemy 【发布时间】:2011-10-06 12:32:34 【问题描述】:

我在 mysql 中存储文件名和文件路径。使用 LIKE 表达式从数据库中检索它们需要我转义所有允许的与 MySQL 特殊字符冲突的文件名字符。我很高兴简单地使用 Python 的 string.replace() 方法,但想知道是否有更标准或内置的方法来使用 SQLAlchemy 清理文件路径或处理 MySQL 中的文件路径。

我需要解决方案与操作系统无关并已建立。它不需要在 SA 中实现。我会接受任何有效的编码程序;如果做不到这一点,我需要一个需要转义的所有字符的列表以及一个转义字符的明智选择。

【问题讨论】:

【参考方案1】:

如果您将使用常规查询,SQLAlchemy 会为您清理。也许你使用like子句的问题。像这样的符号需要添加转义:_%。因此,如果要引用表达式,则需要替换方法。

【讨论】:

我使用.like() 不是问题,这是主要要求。我只需要转义%_ 吗?如何处理文字引号、括号和反斜杠? 您只需要转义 3 个字符,_,%,/。 _ 和 % 是通配符,/ - 转义符号。查询的其他部分将被自动清理【参考方案2】:

为什么需要转义文件路径?只要您不手动编写选择/插入查询,SQLAlchemy 将在内部生成查询时处理转义。

文件路径可以原样插入到数据库中。

【讨论】:

我正在使用.like() SA 方法来选择文件路径。哪个(据我了解)使用%_(还有其他人吗?)作为通配符。两者也是有效的 filname chrs。如果 SA 能够读懂我的想法并知道我何时使用 _ 作为搜索通配符与文件名中的文字字符并为我“照顾”它,那肯定会很奇怪! :) @Toofan:Paul 是对的:SQLAlchemy 不会为.like() 和配偶(.contains().startswith() 等)这样做。它确实为这些方法提供了escape 参数,但您必须自己转义字符串,并提供使用的转义字符。【参考方案3】:

据我所知,SQLAlchemy 中没有您要寻找的东西。自己去basestring.replace()方法吧。

【讨论】:

是的。我知道。我在我的问题中这么说。我应该换成什么? '*' 和 '\' 不是有效的 linux 文件名字符吗?我应该使用一些标准编码吗?我考虑过进行 url 编码,但使用转义或双 % 而不是 %,但它很快就会变得混乱。我正在寻找一个成熟的解决方案。【参考方案4】:

你不需要做任何事情,SQLAlchemy 会为你做。

【讨论】:

在这里阅读 cmets:***.com/questions/6713715/… 那你必须自己编写转义函数:path.replace('%','\\%').replace('_','\_') 或者你可以像这样使用sql:select * from table where a like 'andre*%' escape '*'; 对于这个在 sqlAlchemy 中有一个列操作符,定义如下:like(other, escape=None) sqlalchemy.org/docs/core/… 是的,现在您看到了我的文件路径问题。反斜杠是每个 Windows 文件路径中的字符。在某些文件系统中查找不是有效字符的转义字符是一个问题。我是否需要转义 '" 以及各种括号?就像我的问题所述,我很高兴执行您建议的 .replace() ,但我一直在为 mysql 中的文件路径寻找最佳实践、通用或深思熟虑的解决方案。

以上是关于使用 SQLAlchemy 转义文件路径中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

如何转义属性文件键中的特殊字符?

关于linux特殊含义的转义符

Java中的IO流

java中啥是转义字符,为啥要使用转义

如何转义xml中的特殊字符

如何转义变量中的特殊字符以在 bash 中提供命令行参数