使用 Pymssql 将数据插入 MS SQL DB 时出错
Posted
技术标签:
【中文标题】使用 Pymssql 将数据插入 MS SQL DB 时出错【英文标题】:Error inserting data into MS SQL DB Using Pymssql 【发布时间】:2019-08-27 21:48:26 【问题描述】:已修复
对于一个教育项目,我试图将抓取的数据存储在 MS SQL 数据库中。首先,我希望将每件独特的物品放在products_tb
中。插入唯一产品后,SQL 必须为所述项目生成唯一 ID,即productgroupid
。 products_tb
表只会产生永远不会改变的产品信息,例如productid, category, name and description
。在我得到这个工作后我将创建的第二个表中,我将存储以下数据:productgroupid, price, timestamp
。原因是这些可能会不时改变。使用productgroupid
,我总是可以在任何给定时间对所有数据进行分组并创建图表等等。
问题是我无法让我的pipelines.py
工作。但是我确实设法使用注释的代码块将数据插入到我的 SQL 数据库中:
# self.cursor.execute("INSERT INTO products_tb(productid, category, name, description, price, timestamp) VALUES (%s, %s, %s, %s, %s, %s)",
# (item['productid'], item['category'], item['name'], item['description'], item['price'], item['timestamp']))
似乎正在使用以下代码
pipelines.py
import pymssql
class KrcPipeline(object):
def __init__(self):
self.conn = pymssql.connect(host='DESKTOP-P1TF28R', user='sa', password='123', database='kaercher')
self.cursor = self.conn.cursor()
def process_item(self, item, spider):
# self.cursor.execute("INSERT INTO products_tb(productid, category, name, description, price, timestamp) VALUES (%s, %s, %s, %s, %s, %s)",
# (item['productid'], item['category'], item['name'], item['description'], item['price'], item['timestamp']))
sql_statement = f'''
BEGIN
IF NOT EXISTS (SELECT * FROM [kaercher].[dbo].[products_tb]
WHERE productid = item['productid'])
BEGIN
INSERT INTO [kaercher].[dbo].[products_tb] (productid, category, name, description)
OUTPUT (Inserted.productgroupid)
VALUES (item['productid'], 'item['category']', 'item['name']', 'item['description']')
END
ELSE
BEGIN
SELECT productgroupid FROM [kaercher].[dbo].[products_tb]
WHERE productid = item['productid']
END
END
'''
self.cursor.execute(sql_statement)
self.conn.commit()
return item
items.py
import scrapy
class KrcItem(scrapy.Item):
productid=scrapy.Field()
name=scrapy.Field()
description=scrapy.Field()
price=scrapy.Field()
producttype=scrapy.Field()
timestamp=scrapy.Field()
category=scrapy.Field()
pass
【问题讨论】:
【参考方案1】:编辑:
我错过的另一个小错误。 “IF NOT EXIST”需要改为“IF NOT EXISTS”。
import pymssql
class KrcPipeline(object):
def __init__(self):
self.conn = pymssql.connect(host='DESKTOP-P1TF28R', user='sa', password='123', database='kaercher')
self.cursor = self.conn.cursor()
def process_item(self, item, spider):
# self.cursor.execute("INSERT INTO products_tb(productid, category, name, description, price, timestamp) VALUES (%s, %s, %s, %s, %s, %s)",
# (item['productid'], item['category'], item['name'], item['description'], item['price'], item['timestamp']))
sql_statement = f'''
BEGIN
IF NOT EXISTS (SELECT * FROM [kaercher].[dbo].[products_tb]
WHERE productid = item['productid'])
BEGIN
INSERT INTO [kaercher].[dbo].[products_tb] (productid, category, name, description)
OUTPUT (Inserted.productgroupid)
VALUES (item['productid'], item['category'], item['name'], item['description'])
END
ELSE
BEGIN
SELECT productgroupid FROM [kaercher].[dbo].[products_tb]
WHERE productid = item['productid']
END
END
'''
self.cursor.execute(sql_statement)
self.conn.commit()
return item
原文:
在定义 sql_statement 时,您没有正确调用项目字典中的值。试试这个:
import pymssql
class KrcPipeline(object):
def __init__(self):
self.conn = pymssql.connect(host='DESKTOP-P1TF28R', user='sa', password='123', database='kaercher')
self.cursor = self.conn.cursor()
def process_item(self, item, spider):
# self.cursor.execute("INSERT INTO products_tb(productid, category, name, description, price, timestamp) VALUES (%s, %s, %s, %s, %s, %s)",
# (item['productid'], item['category'], item['name'], item['description'], item['price'], item['timestamp']))
sql_statement = f'''
BEGIN
IF NOT EXIST (SELECT * FROM [kaercher].[dbo].[products_tb]
WHERE productid = item['productid'])
BEGIN
INSERT INTO [kaercher].[dbo].[products_tb] (productid, category, name, description)
OUTPUT (Inserted.productgroupid)
VALUES (item['productid'], item['category'], item['name'], item['description'])
END
ELSE
BEGIN
SELECT productgroupid FROM [kaercher].[dbo].[products_tb]
WHERE productid = item['productid']
END
END
'''
self.cursor.execute(sql_statement)
self.conn.commit()
return item
【讨论】:
您好@Samlegesse,感谢您的解决方案,我非常感谢您,但使用您提供的代码时,我仍然遇到完全相同的错误。 @Bamieschijf 我注意到您遇到操作错误的位置附近有一个错字。请参阅编辑后的答案。 您好@Samlegesse,再次感谢您的反馈。已经取得了进展,但现在我得到了一个不同的语法错误。我在几个 mysql 语法检查器中导入了代码,他们都一直说查询的第一部分有问题,即: IF NOT EXISTS (SELECT * FROM [ kaercher].[dbo].[products_tb] WHERE productid = item['productid'])。我在问题中编辑了我的代码等(见上文) @Bamieschijf 您正在使用 MySQL 语法检查器进行 SQL Server 查询?根据您现在收到的新错误,问题似乎在 productid 附近。 productid 是 varchar 还是 int 类型?如果是 varchar,则需要用引号括起来。 你好 @Samlegesse 我提到了 SQL 语法检查器,这是我的错字。我做了一些更改,数据现在存储在我的数据库中。我不知道这是否是最好的解决方案,但到目前为止数据都存储在我的数据库中。我要感谢您的帮助! :-)以上是关于使用 Pymssql 将数据插入 MS SQL DB 时出错的主要内容,如果未能解决你的问题,请参考以下文章
Pymssql 可以与 MS SQL Server 建立安全连接 (SSL) 吗?