Escape SQL & ldquo; LIKE & rdquo; значение для Postgres с psycopg2

Использование org.apache.commons.io.FileUtils

File file = new File("F:/Lines");       
Collection<File> files = FileUtils.listFiles(file, null, true);     
for(File file2 : files){
    System.out.println(file2.getName());            
} 

Используйте false, если вы не хотите файлы из подкаталогов.

30
задан Community 23 May 2017 в 11:46
поделиться

6 ответов

Я смог выйти % при помощи %% в КАК операнд.

sql_query = "select * from mytable where website like '%%.com'"
cursor.fetchall(sql_query)
2
ответ дан 27 November 2019 в 22:37
поделиться

Если Вы будете использовать подготовленный оператор, то вход будет перенесен в '' для предотвращения внедрения SQL. Здорово, но также и предотвращает вход + sql конкатенация.

лучший и самый безопасный путь вокруг этого состоял бы в том, чтобы передать в % (s) как часть входа.

cursor.execute('SELECT * FROM goats WHERE name LIKE %(name)s', { 'name': '%name%'.format(name)})
0
ответ дан 27 November 2019 в 22:37
поделиться

Не найдя до сих пор встроенной функции, я написал довольно простую:

def escape_sql_like(s):
    return s.replace('\\', '\\\\').replace('%', '\\%').replace('_', '\\_')
0
ответ дан 27 November 2019 в 22:37
поделиться

Да, это настоящий беспорядок. Как MySQL, так и PostgreSQL используют обратную челку - выскакивает для этого по умолчанию. Это ужасная боль, если вы также снова убегаете на строку с обратной червой ячейками вместо использования параметризации, и она также неверна в соответствии с ANSI SQL: 1992, в котором говорится, что есть по умолчанию никаких дополнительных escape символов в верхней части обычной строки, а также Следовательно, никаких способов включать буквальный % или _ .

Я бы предположил бы, что простая обратная кожа - это метод замены также идет не так, если вы выключите обратную косалку - ускоры (которые сами не соответствуют ANSI SQL), используя NO_BACKSLASH_ESCAPE SQL_MODE в MySQL или Standard_conforming_Strings Conf в PostgreSQL (который PostgreSQL Devs угрожает сделать для пары версий сейчас).

Единственное реальное решение состоит в том, чтобы использовать малоизвестен , как синтаксис , чтобы указать явный escape символ для , как -Pattern. Это привыкла вместо обратной косоискателя в MySQL и PostgreSQL, заставляя их соответствовать тому, что все остальные делают и предоставляют гарантированный способ включить неполосные символы. Например, с подписанием = = в качестве побега:

# look for term anywhere within title
term= term.replace('=', '==').replace('%', '=%').replace('_', '=_')
sql= "SELECT * FROM things WHERE description LIKE %(like)s ESCAPE '='"
cursor.execute(sql, dict(like= '%'+term+'%'))

Это работает на PostgreSQL, MySQL и ANSI SQL-совместимых базах данных (модуль параметров, конечно, меняется на разных модулях БД).

Возможно, может быть проблема с MS SQL Server / Sybase, которая, по-видимому, также позволяет [A-Z] группы символов -лей в , как выражения. В этом случае вы хотели бы также избежать буквального характера [ с .replace ('[', '= [') . Однако в соответствии с ANSI SQL избегает персонажа, который не нуждается в сборе, недействителен! (Argh!) Итак, это, вероятно, все равно будет работать через настоящие СУБД, вы все равно не будете соответствовать Ansi. вздох ...

29
ответ дан 27 November 2019 в 22:37
поделиться

Вы можете создать подкласс класса Like , подкласс str и зарегистрировать адаптер для it , чтобы преобразовать его в правильном синтаксисе (например, используя escape_sql_like () , который вы написали).

0
ответ дан 27 November 2019 в 22:37
поделиться

Интересно, действительно ли все вышеперечисленное необходимо? Я использую psycopg2 и просто смог использовать:

data_dict['like'] = psycopg2.Binary('%'+ match_string +'%')
cursor.execute("SELECT * FROM some_table WHERE description ILIKE %(like)s;", data_dict)
1
ответ дан 27 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: