Как исправить соединение pyodbc, сделать запрос и прочитать как панды Dataframe - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь выполнить запрос через pd.read_sql(sql, db_connection_dw)

Соединение работает правильно и выглядит следующим образом:

driver= '{Devart ODBC Driver for ASE}'
server='---' 
db_environment='----'
username='----'
password='----'
port='----'
connectionString = 
('DRIVER='+driver+';SERVER='+server+';PORT='+port+';UID='+username+';PWD='+ 
password + ';DATABASE='+db_environment)
try:
    db_connection_dw = pyodbc.connect(connectionString)
except:
    print('could not connect')
    exit(0)

Запрос следующий, простой, который возвращаетпервые 10 регистров:

sql = """SELECT TOP 10 VariableID, 
            PatientID, 
            CONVERT(VARCHAR(10), ValueTime, 23) as ValueTime 
     FROM PV_VariableValues 
     WHERE VariableID = 15002262 and NumValue = 12 and YEAR(ValueTime) = 2019 and 
     MONTH(ValueTime) = 7
     """

После использования pd.read_sql(sql, db_connection_dw) он возвращает следующий фрейм данных:

    VariableID  PatientID   ValueTime
0   15002262    9811        2019-07-02
1   15002262    9811        2019-07-02
2   15002262    9811        2019-07-03
3   15002262    9811        2019-07-03
4   15002262    9811        2019-07-03
5   15002262    9811        2019-07-03
6   15002262    9811        2019-07-04
7   15002262    9811        2019-07-04
8   15002262    9811        2019-07-04
9   15002262    9922        2019-07-25

Проблема возникает, когда я делаю больший запрос, скажем, TOP 1000После запуска кода возвращается следующая ошибка:

Error: ('HY000', '[HY000] [Devart][ODBC][Adaptive Server Enterprise]Error on data reading from the connection:\r\nSe produjo un error durante el intento de conexión ya que la parte conectada no respondió adecuadamente tras un periodo de tiempo, o bien se produjo un error en la conexión establecida ya que el host conectado no ha podido responder.\r\nSocket Error Code: 10060($274C) (0) (SQLFetch)')

Альтернатива, которую я попробовал, - это прочитать через аргумент chunksize, выполнив следующее после объявления строки sql:

for chunk in pd.read_sql(sql, db_connection_dw, chunksize=10):
    print(chunk)

Но после некоторых распечаток он останавливается и возвращает ту же ошибку.

Есть идеи?

Спасибо за продвижение

1 Ответ

0 голосов
/ 01 октября 2019

Поскольку вы подключаетесь к базе данных sybase, попробуйте изменить эту часть:

driver ='{Adaptive Server Enterprise}'

убедитесь, что драйверы установлены. Чтобы проверить список установленных драйверов ODBC из python, запустите следующий код:

import pyodbc

pyodbc.drivers()

Вы должны увидеть имя драйвера '{Adaptive Server Enterprise}' , если оно установлено.

...