Python для SQL server — Недопустимое значение символа для спецификации приведения

#python #web-scraping

Вопрос:

У меня есть код, который выполняется из приведенного ниже кода. Это подключает данные веб-очистки непосредственно к sql server.

 import pypyodbc as odbc
import cursor
import requests
import pandas as pd
import numpy as np
url = "https://www.cse.lk/api/tradeSummary"
data = requests.post(url).json()
df = pd.DataFrame(data["reqTradeSummery"])
 df = df.astype({'id': float, 'name': str, 'symbol': str, 'quantity': float, 'percentageChange': float, 'change': float, 'price': float, 'previousClose': float, 'high': float,
                'low': float, 'lastTradedTime': str, 'issueDate': str, 'turnover': float, 'sharevolume': float, 'tradevolume': float, 'marketCap': float, 'marketCapPercentage': float,
                'open': float, 'closingPrice': float, 'crossingVolume': float, 'crossingTradeVol': float, 'status': float})
 

При выборе типов df.dtypes он представляет собой

 id                     float64
name                    object
symbol                  object
quantity               float64
percentageChange       float64
change                 float64
price                  float64
previousClose          float64
high                   float64
low                    float64
lastTradedTime          object
issueDate               object
turnover               float64
sharevolume            float64
tradevolume            float64
marketCap              float64
marketCapPercentage    float64
open                   float64
closingPrice           float64
crossingVolume         float64
crossingTradeVol       float64
status                 float64
dtype: object
 

В sql-сервере,

 COLUMN_NAME DATA_TYPE
datekey datetime
id  float
name    nvarchar
symbol  nvarchar
quantity    float
percentageChange    float
change  float
price   float
previousClose   float
high    float
low float
lastTradedTime  float
issueDate   datetime
turnover    float
sharevolume float
tradevolume float
marketCap   float
marketCapPercentage float
open    float
closingPrice    float
crossingVolume  float
crossingTradeVol    float
status  float
 

Но когда я выполняю запрос, он выдает следующее сообщение об ошибке.

 ---------------------------------------------------------------------------
DataError                                 Traceback (most recent call last)
<ipython-input-1-4abba6d97d90> in <module>
     48     cursor = conn.cursor()
---> 49     cursor.executemany(sql_insert, records)
     50     cursor.commit();

C:ProgramDataAnaconda3libsite-packagespypyodbc.py in executemany(self, query_string, params_list)
   1670         for params in params_list:
-> 1671             self.execute(query_string, params, many_mode = True)
   1672         self._NumOfRows()

C:ProgramDataAnaconda3libsite-packagespypyodbc.py in execute(self, query_string, params, many_mode, call_mode)
   1595                 #print param_valparam_buffer, param_buffer.value
-> 1596                 check_success(self, ret)
   1597 

C:ProgramDataAnaconda3libsite-packagespypyodbc.py in check_success(ODBC_obj, ret)
    985         if isinstance(ODBC_obj, Cursor):
--> 986             ctrl_err(SQL_HANDLE_STMT, ODBC_obj.stmt_h, ret, ODBC_obj.ansi)
    987         elif isinstance(ODBC_obj, Connection):

C:ProgramDataAnaconda3libsite-packagespypyodbc.py in ctrl_err(ht, h, val_ret, ansi)
    955             elif state[:2] in (raw_s('22')):
--> 956                 raise DataError(state,err_text)
    957             elif state[:2] in (raw_s('23')) or state == raw_s('40002'):

DataError: ('22018', '[22018] [Microsoft][ODBC SQL Server Driver]Invalid character value for cast specification')

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
<ipython-input-1-4abba6d97d90> in <module>
     51 except Exception as e:
     52     cursor.rollback()
---> 53     print(str(e[1]))
     54 finally:
     55     print('Task is complete.')

TypeError: 'DataError' object is not subscriptable
 

Код на python до сегодняшнего дня работал идеально. Но по какой-то причине это выдает мне сообщение об ошибке, как указано выше. Ранее я не использовал приведенный ниже код в основном коде, как указано выше. Но я получаю то же самое сообщение об ошибке.

  df = df.astype({'id': float, 'name': str, 'symbol': str, 'quantity': float, 'percentageChange': float, 'change': float, 'price': float, 'previousClose': float, 'high': float,
                'low': float, 'lastTradedTime': str, 'issueDate': str, 'turnover': float, 'sharevolume': float, 'tradevolume': float, 'marketCap': float, 'marketCapPercentage': float,
                'open': float, 'closingPrice': float, 'crossingVolume': float, 'crossingTradeVol': float, 'status': float})
 

Кто-нибудь может мне помочь это исправить? было бы действительно здорово. Я действительно потеряюсь, если не смогу исправить это сегодня.

Комментарии:

1. Столбец «lastTradedTime» находится float в базе данных, но object в python . Может быть, в нем есть что-то, что не является числом?