当我尝试使用
pandas.read_sql
从带有 pandas 的 SQL 数据库中读取表时,pyodbc 包会抛出一个我想捕获的 DataError
(pyodbc.DataError)。 DataError
是由意外的nvarchar值引起的,导致pyodbc尝试将其转换为int数据类型时转换失败。
这是我的代码:
import pandas as pd
import pyodbc
from sqlalchemy import create_engine
from sqlalchemy.engine import URL
driver = "SQL Server"
server = "my_server"
database = "my_db"
connection_string = (f"Driver={driver};"
f"Server={server};"
f"Database={database};"
f"Trusted_Connection=yes;"
f"TrustServerCertificate=yes")
connection_url = URL.create("mssql+pyodbc",
query={"odbc_connect": connection_string})
engine = create_engine(connection_url)
# select only the first 10 rows in a table
query = (f"SELECT top 10 * "
f"FROM abc.table_name")
df = pd.read_sql(sql=query,
con=engine)
输出是
DataError: (pyodbc.DataError) ('22018', "[22018] [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting the nvarchar value '00:35' to data type int. (245) (SQLExecDirectW)")
[SQL: SELECT top 10 * FROM abc.table_name]
(Background on this error at: https://sqlalche.me/e/14/9h9h)
我知道如何在 Python 中使用 try
和 except
语句来
捕获和处理
内置异常。然而
DataError
(pyodbc.DataError) 不是内置异常。我想捕获这个特定于包的错误,而不仅仅是捕获any错误(我理解这是不好的做法)。
我已尝试以下操作:
try:
df = pd.read_sql(sql=query,
con=engine)
except DataError as err:
print(err)
pass
这会导致
NameError: name 'DataError' is not defined
(据我了解,因为 DataError
不是内置异常)。
我还尝试过以下方法:
try:
df = pd.read_sql(sql=query,
con=engine)
except pyodbc.DataError as err:
print(err)
pass
这会导致
DataError: (pyodbc.DataError)
,因为错误未被捕获。
DataError
似乎是SQLalchemy的例外,请参阅文档:https://docs.sqlalchemy.org/en/20/core/exceptions.html#sqlalchemy.exc.DataError
尝试:
from sqlalchemy.exc import DataError
然后
try:
df = pd.read_sql(sql=query,
con=engine)
except DataError as err:
print(err)
pass