代码之家  ›  专栏  ›  技术社区  ›  user3734568

在python中读取SQL表

  •  3
  • user3734568  · 技术社区  · 6 年前

    下面是我使用的脚本,能够正确读取数据。

    Data = pd.read_sql_query("SELECT * from Data where [ID] = " + id ,engine)
    

    但当in type for column ID更改为nvarchar时,出现了以下错误。

    DatabaseError: Execution failed on sql 'SELECT * from Data where [ID] = 123': ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Error converting data type nvarchar to numeric. (8114) (SQLExecDirectW)')
    

    是否有任何方法可以使用nvarchar列筛选表?

    2 回复  |  直到 6 年前
        1
  •  5
  •   Joshua Schlichting    4 年前

    重要提示:

    SQL查询文本中使用的字符串连接通常表示 SQL injection vulnerability 别这样。 考虑到大多数用于SQL连接的包和库都提供了一种真正的方法,可以使用占位符和参数将数据传递到查询中—请使用此方法。如果确定要使用字符串连接,请不要连接来自外部源/用户/客户端/除“you”以外的任何人的数据


    原始答案

    id 也是这样。

    Data = pd.read_sql_query("SELECT * from Data where [ID] = CAST(" + id + " AS NVARCHAR(10))", engine)
    

    注意:我给你的NVARCHAR(尺寸)打了10分,但你最终要确定应该是什么。

        2
  •  3
  •   Mureinik    6 年前

    SQL Server将尝试将nvarchar列转换为整数,以匹配ID的文本类型,如您所见,这不会发生变化—相反,您需要将ID作为nvarchar文本传递。一种方法是使用单引号和前面的 N :

    Data = pd.read_sql_query("SELECT * from Data where [ID] = N'" + id + "'" ,engine)
    

    但是这样的字符串操作技术使您的代码容易受到SQL注入攻击。更好的方法是将ID作为参数传递:

    Data = pd.read_sql_query("SELECT * from Data where [ID] = %s", engine, params=(id,))