You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用pyodbc操作SQL Server报Invalid column name错误如何解决?

报错原因
  • SQL语法不符合SQL Server规范:SQL Server中字符串字面量要求使用单引号包裹,你代码里INSERT语句的VALUES值用了双引号\"包裹,结合你的数据库配置ALTER DATABASE [company] SET QUOTED_IDENTIFIER OFF的规则,双引号包裹的内容会被SQL Server解析为标识符(列名、表名这类对象名),因此SQL会把"343"这类内容当成名为343的列去匹配,找不到对应列就触发Invalid column name报错。
  • 额外问题:硬拼接SQL的写法存在SQL注入风险,不符合生产环境编码规范。
修复方案

方案1:直接修正SQL引号(临时修复)

把INSERT语句里包裹值的双引号替换为单引号,Python中外层用双引号包裹SQL语句时,内部单引号不需要转义:

cursor.execute("INSERT INTO [dbo].[comp] ([mst] ,[company_name]  ,[address] ,[legal_representative]) VALUES  ('343', '565', '343', '343')")

方案2:使用参数化查询(推荐,更安全)

pyodbc支持参数化查询,用?作为占位符,参数作为execute的第二个参数传入,既可以避免引号转义问题,又能防范SQL注入风险:

insert_sql = "INSERT INTO [dbo].[comp] ([mst] ,[company_name]  ,[address] ,[legal_representative]) VALUES (?, ?, ?, ?)"
# 元组内的值可以替换为你实际爬取到的变量
cursor.execute(insert_sql, ('343', '565', '343', '343'))

额外性能优化建议

不要把数据库连接写在parse方法里,避免每次请求都重复创建销毁连接,建议把连接初始化逻辑放到爬虫生命周期方法中:

class BlogSpider(scrapy.Spider):
    name = 'blogspider'
    start_urls = ['https://masothue.com/']

    def open_spider(self, spider):
        # 爬虫启动时仅创建一次连接
        self.cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=DESKTOP-23PIH3M;DATABASE=company;UID=sa;PWD=123456a@')
        self.cursor = self.cnxn.cursor()

    def close_spider(self, spider):
        # 爬虫关闭时释放连接资源
        self.cursor.close()
        self.cnxn.close()

    def parse(self, response):
        insert_sql = "INSERT INTO [dbo].[comp] ([mst] ,[company_name]  ,[address] ,[legal_representative]) VALUES (?, ?, ?, ?)"
        self.cursor.execute(insert_sql, ('343', '565', '343', '343'))
        self.cnxn.commit()
        # 剩余爬取逻辑省略

内容的提问来源于stack exchange,提问作者Đỗ Như Vỹ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 08:00:01