Warm tip: This article is reproduced from serverfault.com, please click

其他-最近版本中Python的字符串格式化程序更改是否破坏了MySQL连接器?

(其他 - Has Python's string formatter changes in recent editions broken the MySQL connector?)

发布于 2020-11-28 05:16:41

我正在写一个简单的-或者应该很简单-脚本来从Twitter的API获取推文(我有开发人员/应用程序密钥,并且正在使用Tweepy界面,而不是抓取或类似的任何东西-我可能会抛弃Tweepy以获得更接近的东西现代化的API,但这几乎肯定不是导致此问题的原因)。

我有一个连接到的MySQL实例,可以很好地查询,直到需要插入推文时为止-这几乎不可避免地包含很多特殊字符。需要明确的是,我使用的是MySQL的官方Python驱动程序/连接器。

import mysql.connector
from mysql.connector import errorcode

现在,我知道StackOverflow充满了线程,人们在其中得到我的确切错误-只是声明要检查MySQL语法手册。这些线程的使用年限并不长(我没有使用最新的Python,我使用3.7.9来与某些NLP库兼容)坚持认为答案是将具有特殊字符的字符串放入旧的-样式格式的字符串(在cursor.execute方法中),以将字符串变量占位符括在引号中,并在仅插入一个变量的情况下传递带有空第二个值的元组。这也是在MySQL网站上作为错误报告响应的一部分发布的解决方案-但是,我没有成功。

这就是我所得到的-按照此处数十页和官方数据库网站上的说明进行操作:

for tweet in tweepy.Cursor(twilek.search, q=keyword, tweet_mode='extended').items():
            twi_tweet = tweet.full_text
            print(twi_tweet)
            twi_tweet = twi_tweet.encode('utf8')
            requests_total+=1
            os.environ['TWITTER_REQUESTS'] = str(requests_total)
            requests_total = int(os.environ.get('TWITTER_REQUESTS'))
            # insert the archived tweet text into the database table
            sql = 'USE hate_tweets'
            ms_cur.execute(sql)
            twi_tweet = str(twi_tweet)
            insert_tweet = re.sub(r'[^A-Za-z0-9 ]+', '', twi_tweet)
            ms_cur.execute("INSERT INTO tweets_lgbt (text) VALUES %s" % (insert_tweet,))
            cnx.commit()
            print(ms_cur.rowcount, "record inserted.")

(twilek是我的光标对象,因为我是个傻瓜)

预期结果:字符串格式化程序将经过修改的tweet字符串传递给MySQL,该字符串可以处理并作为一行添加到tweets_lgbt表中

实际结果:任何推文的语法错误都将导致插入失败

我已经尝试过使用正则表达式剥离除字母数字和空格以外的所有内容-同样的问题。我想知道当前Python版本的新字符串格式功能是否已与此连接器失去兼容性?我更喜欢使用官方驱动程序,但是如果需要的话,我将切换到ORM。(我确实尝试了F字符串等较新的功能,并发现它们导致了相同的结果。)

Questioner
Ellie Lockhart
Viewed
11
CodeIt 2020-12-09 00:21:07

这是你应该在表格中插入一行的方式,

insert_tweet = "ABCEFg 9 XYZ"
"INSERT INTO tweets_lgbt (text) VALUES ('%s');"%(insert_tweet)
"INSERT INTO tweets_lgbt (text) VALUES ('ABCEFg 9 XYZ');"

注意事项

  1. 字符串格式化程序的参数就像函数的参数一样。因此,你不能在末尾添加逗号来将字符串转换为元组。

  2. 如果你尝试一次插入多个值,则可以使用cursor.executemany或此答案