Мне дается Python Список произвольной длины, содержащий произвольные строки. В частности, он может содержать строки со встроенными одинарными и / или двойными кавычками. У меня нет контроля над вводом, поэтому я должен взять то, что мне дано.
Например:
valueList = [ "hello'world", 'foo"bar', 'my\'name"is', "see\'you\"soon" ]
Python shell:
>>> valueList = [ "hello'world", 'foo"bar', 'my\'name"is', "see\'you\"soon" ]
>>>
>>> valueList
["hello'world", 'foo"bar', 'my\'name"is', 'see\'you"soon']
>>>
>>> valueList[0]
"hello'world"
>>>
>>> valueList[1]
'foo"bar'
>>>
>>> valueList[2]
'my\'name"is'
>>>
>>> valueList[3]
'see\'you"soon'
Отсюда мне нужно сгенерировать строку SQL, например:
"SELECT * FROM myTable as mt
WHERE mt."colName" IN ("hello'world", 'foo"bar', 'my\'name"is', 'see\'you"soon')
Любое решение должно работать как с SQLite, так и с Postgres.
Я попытался сгенерировать (...) часть предложения, используя соединение Python, но это просто заканчивается тем, что создается одна большая строка со всеми одинарными кавычками. Например:
Python shell:
>>> values = "','".join(valueList)
>>> values
'hello\'world\',\'foo"bar\',\'my\'name"is\',\'see\'you"soon'
>>> values = "'" + "','".join(valueList) + "'"
>>> values
'\'hello\'world\',\'foo"bar\',\'my\'name"is\',\'see\'you"soon\''
Дополнительная информация: унаследованный мной код использует SQLAlchemy и Pandas.
import pandas as pd
...cut...cut...cut...
my_df = pd.read_sql(sql, my_conn);
Я НЕ хочу использовать Pandas для фильтрации. Фактически, моя назначенная задача - УДАЛИТЬ существующую фильтрацию Pandas и заменить ее SQL с явными фильтрами WHERE / IN для скорости.
Например, замените это:
my_df = pd.read_sql("SELECT * FROM myTable", my_conn) <==== can return 10's of thousands of rows
my_df = my_df[my_df.loc[:, 'colName'].isin(myList)] <==== ends up with a handful of rows
с этим:
my_df = pd.read_sql("SELECT * FROM myTable as mt WHERE mt."colName" IN ("hello'world", 'foo"bar', ...)", my_conn)
SQL защита от инъекций является плюсом, но на данный момент я буду доволен любым решением, которое работает.