2017-02-08 1 views
1

Я пытаюсь передать список, как показано ниже на SQL-запросПередача списка значений из Python к статье В части SQL-запроса

x = ['1000000000164774783','1000000000253252111'] 

Я использую SQLAlchemy и pyodbc для подключения к sql:

import pandas as pd 
from pandas import Series,DataFrame 
import pyodbc 
import sqlalchemy 

cnx=sqlalchemy.create_engine("mssql+pyodbc://Omnius:[email protected]:1433/Basis?driver=/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0") 

Я попытался использовать различные функции строкового формата, которые будут использоваться в sql-запросе. Ниже один из них

xx = ', '.join(x) 
    sql = "select * from Pretty_Txns where Send_Customer in (%s)" % xx 
    df = pd.read_sql(sql,cnx) 

Все они, кажется, чтобы преобразовать его в цифровой формат

(1000000000164774783, 1000000000253252111) instead of ('1000000000164774783','1000000000253252111') 

И, следовательно, запрос терпит неудачу, как тип данных Send_Customer является VARCHAR (50) в SQL

ProgrammingError: (pyodbc.ProgrammingError) ('42000', '[42000] [Microsoft][SQL Server Native Client 11.0] 
    [SQL Server]Error converting data type varchar to numeric. (8114) (SQLExecDirectW)') 
[SQL: 'select * from Pretty_Txns where Send_Customer in (1000000000164774783, 1000000000253252111)'] 

ответ

3

Как указано в комментарии к другому ответу, этот подход может потерпеть неудачу по целому ряду причин. То, что вы действительно хотите сделать это создать оператор SQL с требуемым числом параметров заполнителей, а затем использовать параметр read_sqlparams= поставлять значения:

x = ['1000000000164774783','1000000000253252111'] 
placeholders = ','.join('?' for i in range(len(x))) # '?,?' 
sql = "select * from Pretty_Txns where Send_Customer in (%s)" % placeholders 
df = pd.read_sql(sql, cnx, params=x) 
-1

Используется ниже подход и он работал отлично:

 sql = "select * from Pretty_Txns where Send_Customer in %s" % str(tuple(x)) 
     df = pd.read_sql(sql,cnx) 
+1

Страшная мысль. Это склонно к SQL-инъекции, и 'str' не обязательно избегает значений так, как ожидает SQL (например, объект' unicode' в Python 2 будет выводить 'u'whatever''). – univerio

Смежные вопросы