【问题标题】:Store numpy array in SQL Server在 SQL Server 中存储 numpy 数组
【发布时间】:2020-10-10 08:53:01
【问题描述】:

我尝试使用 pyodbc 将腌制的 numpy 数组作为 VARBINARY(MAX) 对象存储在 SQL Server 中。 SQL Server 的 INSERT 语句如下所示:

INSERT INTO [dbo].[Images]
           ([UserId]
           ,[FileName]
           ,[FeaturesVector])
     VALUES
           (<UserId, int,>
           ,<FileName, nchar(100),>
           ,<FeaturesVector, varbinary(max),>)

在我的 python 代码中,我将查询构建为 fstring:

query = f"INSERT INTO Images(UserID, FileName, FeaturesVector) \
                VALUES ('{user_id}', '{file_name}', '{features_vector}')"

当我尝试将对象插入数据库时​​:

features_vector = np.arange(1)
features_vector.astype('float32')
features_vector = pickle.dumps(features_vector)
query = f"INSERT INTO Images(UserID, FileName, FeaturesVector) \
                VALUES ('{user_id}', '{file_name}', '{features_vector}')"
cnxn.execute(query)
cnxn.commit()

我得到一个错误:

('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]'\' 附近的语法不正确。(102) (SQLExecDirectW)")

【问题讨论】:

  • 不要注入,参数化。同样,您的反斜杠(\ )似乎被解释为文字,而不是转义字符。
  • 我删除了反斜杠,仍然不起作用。你能解释一下如何不注入参数化吗?
  • 从一个快速的Google 我得到:How to put parameterized sql query into variable and then execute in Python?),它显示了该方法。
  • 您不需要在查询中转义 \。您似乎打算使用它将 python 字符串分成两行,而不是 SQL 查询本身。

标签: python sql-server


【解决方案1】:

使用 pyodbc 的可靠插入方法 - 为什么?

@quarkpol,我感受到了你的痛苦!前段时间我遇到了这个问题,我不明白为什么我必须以我必须这样做的方式来做,但我必须这样做才能让它发挥作用,而且我注意到其他人也在这样做.

首先,当您在读取数据时执行以下操作时,以下...

query_string = f'SELECT {col_name_1}, {col_name_2} FROM {some_table} WHERE {other_col} = {some_val}
cursor.execute(query_string)
# do some stuff with what the cursor got

python f'stuff' 类型语句效果很好!

但是,在插入时,我发现我必须执行以下操作才能使其正常工作...

command_string = f'''INSERT INTO My_Table
                    (Col_Name_1, Col_Name_2, Col_Name_3) VALUES (?, ?, ?);'''
cursor.execute(command_string, val_1, val_2, val_3)
conn.commit()

同样,我不知道为什么,但至少这是可行的。

【讨论】:

    猜你喜欢
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2019-10-26
    相关资源
    最近更新 更多