【问题标题】:Python DatabaseError with SQL ServerSQL Server 的 Python 数据库错误
【发布时间】:2021-11-02 04:25:24
【问题描述】:

我编写了一个 python 脚本来循环访问 Microsoft SQL Server 中的一些表。 90% 的情况下,可以使用相同的查询,但另外 10%(估计)由于一些不同的标题,我必须使用不同的查询。

Spyder 正在显示一个

DatabaseError: sql 执行失败

接着说我的列名无效。我想使用 try/except 来解决这个问题,但它说

NameError: 'DatabaseError' 未定义

我尝试使用except Exception as e,但还是不行。

脚本看起来像这样

query1 = """
        SELECT count(distinct column1) [Col1]
        ,SUM(CASE WHEN column2 <> '' THEN 1 ELSE 0 END)[Col2]
        ,SUM(CASE WHEN colum3 <> '' THEN 1 ELSE 0  END)[Col3]
        FROM {query_table} with (nolock)
        """
query2 = """
        SELECT count(distinct column_1) [Col1]
        ,SUM(CASE WHEN column_2 <> '' THEN 1 ELSE 0 END)[Col2]
        ,SUM(CASE WHEN column3 <> '' THEN 1 ELSE 0  END)[Col3]
        FROM {query_table} with (nolock)
        """     

for table in processed_df['Table Name']:
    row_df = processed_df[processed_df['Table Name'] == table]
    try:
       query_results = pd.read_sql_query(query1.format(query_table = table), conn)
  
    except DatabaseError:
       query_results = pd.read_sql_query(query2.format(query_table = table), conn)

编辑

下面给出的答案是正确的,我想给 Erik 加分,尽管我有一些拼写错误,但他还是解决了这个问题。

也就是说,我想展示我发现的另一个选项,以防它可以帮助其他人。

    try:
       # Try thing 1
  
    except pyodbc.Error: 
       # Try thing 2
    
    except:
       # If all else fails, do thing 3

我的代码中没有显示我使用的是 pyodbc 的事实。我收到的错误是DatabaseError,但说明没有帮助。

我切换到pyodbc.Error,这让我可以添加一个最终的except 语句以防万一。希望这对其他人有帮助!

【问题讨论】:

  • query1 最后缺少 FROM {query_table} 部分。
  • 我会解决这个问题的。但在我的脚本中并非如此。谢谢你接听。
  • 我还注意到,在您的 except: 部分中,您调用的命令与 try 中的命令完全相同,因此如果 try 抛出异常,则 except 很可能会抛出相同的命令。当您尝试 except Exception as e: 而不是 except DatabaseError: 时,是否改变了它的失败方式?
  • 仍然收到DatabaseError: Execution failed on sql '

标签: python sql-server error-handling try-catch


【解决方案1】:

假设实际代码中的 query1 和 query2 不同,您可能希望将 try 块更改为:

    try:
       query_results = pd.read_sql_query(query1.format(query_table = table), conn)
  
    except:
       query_results = pd.read_sql_query(query2.format(query_table = table), conn)

正如您在问题中所写,两个调用都使用 query1,因此每当您在 try 部分遇到异常时,except 部分通常会抛出与您刚刚捕获的异常相同的异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多