如何在字段中插入带有字符[']的表(pymssql)

Posted

技术标签:

【中文标题】如何在字段中插入带有字符[\']的表(pymssql)【英文标题】:How to insert into a table with character['] in the field (pymssql)如何在字段中插入带有字符[']的表(pymssql) 【发布时间】:2016-12-17 15:32:27 【问题描述】:

我正在尝试使用 python 从 csv 文件填充我的数据库。 下面是我用来填充sales 表的代码:

import csv
import pymssql as psql

conn = psql.connect('localhost:8888', 'SA', 'superSecret','videogame')
cursor = conn.cursor()
cursor.execute("""
  IF OBJECT_ID('sales', 'U') IS NOT NULL
    DROP TABLE sales

  CREATE TABLE sales
  (
    Id int,
    Name varchar(250),
    Platform varchar(250),
    Year int,
    Genre varchar(250),
    Publisher varchar(250),
    NA_Sales float,
    EU_Sales float,
    JP_Sales float,
    Other_Sales float,
    Global_Sales float
  )
""")
conn.commit()

with open ('./sales.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        row[1] = row[1].replace("'", "")
        row[5] = row[5].replace("'", "")
        data = tuple(row)
        query = 'insert into sales values 0'.format(data).replace("N/A","0")
        print(query)
        cursor.execute(query)

conn.commit()
conn.close()

但是,我的一些数据在其名称列中包含字符:(')(例如刺客信条)。这导致了一个错误,如下所示:

insert into sales values ('129', "Assassin's Creed III", 'PS3', '2012', 'Action', 'Ubisoft', '2.64', '2.56', '0.16', '1.14', '6.5')
Traceback (most recent call last):
  File "pymssql.pyx", line 447, in pymssql.Cursor.execute (pymssql.c:7119)
  File "_mssql.pyx", line 1011, in _mssql.MSSQLConnection.execute_query (_mssql.c:11586)
  File "_mssql.pyx", line 1042, in _mssql.MSSQLConnection.execute_query (_mssql.c:11466)
  File "_mssql.pyx", line 1175, in _mssql.MSSQLConnection.format_and_run_query (_mssql.c:12746)
  File "_mssql.pyx", line 1586, in _mssql.check_cancel_and_raise (_mssql.c:16880)
  File "_mssql.pyx", line 1630, in    _mssql.maybe_raise_MSSQLDatabaseException (_mssql.c:17524)
_mssql.MSSQLDatabaseException: (207, b"Invalid column name 'Assassin's   Creed III'.DB-Lib error message 20018, severity 16:\nGeneral SQL Server    error: Check messages from the SQL Server\n")

除了手动更新行之外,还有其他解决方法吗(例如row[1] = row[1].replace("'","")

谢谢!!

【问题讨论】:

【参考方案1】:

您可以使用适当的参数化查询,如下所示:

row = ["Assassin's", "N/A", 9]  # test data as list (e.g., from CSV)
data = tuple("0" if x=="N/A" else x for x in row)
print(data)  # ("Assassin's", '0', 9)
placeholders = ','.join(['%s' for i in range(len(data))])
query = 'INSERT INTO sales VALUES (0)'.format(placeholders)
print(query)  # INSERT INTO sales VALUES (%s,%s,%s)
cursor.execute(query, data)

【讨论】:

如果我们想一次处理 1000 行,这将如何概括?也就是说,我们想做类似INSERT INTO sales VALUES (0,1,2),(3,4,5),(6,7,8)...? 这是否等同于VALUES(0,1,2),(3,4,5),(6,7,8)... 符号?还是它正在执行单个INSERT @Adrian - 通过使用 Microsoft 的 SQL Server ODBC 驱动程序并在光标上启用 fast_executemany,我们得到与您描述的相同的内容(尽管不是使用表值构造函数 本身 i>)。 在连接 pymssql 花了一整天之后,切换到不同的连接范式似乎需要更多的工作。我想我已经通过使字符串的形状和参数元组正确来使其工作。它不是那么快,但它对 SQL 注入更加健壮,我想它现在可以正确处理单引号了。【参考方案2】:

您可以将' 替换为\',这样可以防止它崩溃,同时在数据中保留撇号:

with open ('./sales.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        row[1] = row[1].replace("'", "\'")
        row[5] = row[5].replace("'", "\'")
        data = tuple(row)
        query = 'insert into sales values 0'.format(data).replace("N/A","0")
        print(query)
        cursor.execute(query)

【讨论】:

问题是您在 Python 中转义了字符,而错误发生在 SQL INSERT 语句中 - 即在数据库中。转义单引号的常用方法是将其加倍:'',但这也不起作用。

以上是关于如何在字段中插入带有字符[']的表(pymssql)的主要内容,如果未能解决你的问题,请参考以下文章

如何在列表pymssql中循环插入值?

插入带有字符串插入或表类型的表

在字符串字段中使用带有单引号的 CSV 文件插入会导致错误

无法使用 pyodbc 在 Access 数据库的表中插入/更新长文本字段

如何修复使用 pymssql 插入 sql DB 的错误

python中pymssql如何向sql server插入数据 插入的值可以用变量替换