【问题标题】:pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax nearpyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]语法不正确
【发布时间】:2021-06-03 08:54:15
【问题描述】:

我正在使用 python 3.9 使用 pyobc 将来自 google rss 新闻的多个新闻列表插入带有参数的 SQL 表,但总是出现以下编程错误:

cursor.execute(query) pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]'cò' 附近的语法不正确 . (102) (SQLExecDirectW)")

我检查了 sql 表,发现实际上一些记录已成功导入 SQL(15 条记录),但不是全部(30 条记录)

下面是我所有的代码请帮忙!

import bs4
from bs4 import BeautifulSoup as soup
from urllib.request import urlopen
import pyodbc

news_url="https://news.google.com/rss?hl=vi&gl=VN&ceid=VN:vi"
Client=urlopen(news_url)
xml_page=Client.read()
Client.close()
soup_page=soup(xml_page,"xml")
news_list=soup_page.findAll("item")

cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=ADMIN;DATABASE=NewsCollect2')
cursor = cnxn.cursor()

for news in news_list:
    query = f"insert into news2(Title,Source1,Time1) values (N'"+news.title.text+"',N'"+news.source.text+"',N'"+news.pubDate.text+"')"
    cursor.execute(query)
    cursor.commit()
cursor.close()
cnxn.close()

p/s 我尝试提取到 txt 文件,它工作得很好

【问题讨论】:

  • 猜猜如果有人在其中一个字段中输入 '); DROP TABLE Users; -- 会发生什么。不要通过连接用户数据来创建查询。再多的引用或清理都无法保护您免受 SQL 注入。使用parameterized queries 更安全、更更容易
  • @Panagiotis Kanavos 成功了。你拯救了我的一天。非常感谢!

标签: python sql-server beautifulsoup pyodbc


【解决方案1】:

正如@PanagiotisKanavos 评论的那样,使用行业推荐的 SQL 参数化最佳实践,它超越了 Python 和 SQL Server,但 any 应用层代码和 any SQL 兼容数据库.

这种方法不仅可以安全地转义用户提交的值,还可以避免特殊字符的破坏,例如每个案例的重音符号,甚至字符串中的引号。此外,您还增强了代码的可读性、可维护性和可以说的效率。甚至考虑executemany

# PREPARED STATEMENT (NO DATA)
query = "insert into news2 (Title, Source1, Time1) values (?, ?, ?)"

# LIST OF TUPLES FOR PARAMS
data = [(news.title.text, news.source.text, news.pubDate.text) for news in newslist]

# EXECUTE STATEMENT AND BIND PARAMS
cursor.executemany(query, data)
cursor.commit()

【讨论】:

    【解决方案2】:

    在python3中,你需要在你的conn之后添加两行

    import pyodbc as db # forgot the imports
    conn = pyodbc.connect(driver=driver, server=serv, database=db,port = prt,
                      uid=usr, pwd=passwd)
    conn.setdecoding(db.SQL_CHAR, encoding='latin1')
    conn.setencoding('latin1')
    

    【讨论】:

    • 使用 psql odbc 驱动程序为我工作
    猜你喜欢
    • 2020-02-26
    • 1970-01-01
    • 2021-09-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    相关资源
    最近更新 更多