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

最近版本中Python字符串格式化程序的更改是否破坏了MySQL连接器?,mysql,python-3.x,string,formatting,mysql-python,Mysql,Python 3.x,String,Formatting,Mysql Python,我正在编写一个简单的(或者应该是简单的)脚本,从Twitter的API获取推文。我有开发者/应用程序密钥,正在使用Tweepy界面,而不是抓取或诸如此类的东西。我可能会为了更接近现代API的东西而放弃Tweepy,但这几乎肯定不是造成这个问题的原因 我有一个MySQL实例,我连接到它,可以很好地查询,直到插入tweet的时候——它有很多特殊字符,几乎是不可避免的。为了清楚起见,我正在使用MySQL的官方Python驱动程序/连接器 import mysql.connector from mysq

我正在编写一个简单的(或者应该是简单的)脚本,从Twitter的API获取推文。我有开发者/应用程序密钥,正在使用Tweepy界面,而不是抓取或诸如此类的东西。我可能会为了更接近现代API的东西而放弃Tweepy,但这几乎肯定不是造成这个问题的原因

我有一个MySQL实例,我连接到它,可以很好地查询,直到插入tweet的时候——它有很多特殊字符,几乎是不可避免的。为了清楚起见,我正在使用MySQL的官方Python驱动程序/连接器

import mysql.connector
from mysql.connector import errorcode
现在,我意识到StackOverflow充斥着线程,人们会在其中发现我的确切错误——只是简单地声明检查MySQL语法手册。这些线程并不太旧,我也没有使用最新的Python,为了与某些NLP库兼容,我使用3.7.9。答案是将包含特殊字符的字符串放入游标内的旧式格式字符串中。execute方法将字符串变量占位符括在引号中,和我的例子一样,如果只插入一个变量,则传递第二个值为空的元组。这也是MySQL网站上发布的bug报告响应的一部分,但我没有成功

以下是我得到的信息-按照几十页上的说明和官方数据库网站:

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是我的光标对象,因为我是个呆子

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

实际结果:任何tweet的语法错误导致插入失败


我已经尝试使用正则表达式来去除除字母数字和空格以外的所有内容——这是同一个问题。我想知道当前Python版本的新字符串格式特性是否破坏了与此连接器的兼容性?我更喜欢使用官方驱动程序,但如果必须,我会切换到ORM。我尝试了F字符串之类的新功能,发现它们产生了相同的结果。

这是您应该如何在表中插入一行

插入_tweet=ABCEFg 9 XYZ 在tweets_lgbt中插入文本值“%s”;%插入推文 在tweets_lgbt文本值中插入'ABCEFg 9 XYZ'; 注意事项 字符串格式化程序的参数与 作用因此,不能在末尾添加逗号来转换字符串 到那里的元组

如果要同时插入多个值,可以使用或


这就是在表中插入行的方式

插入_tweet=ABCEFg 9 XYZ 在tweets_lgbt中插入文本值“%s”;%插入推文 在tweets_lgbt文本值中插入'ABCEFg 9 XYZ'; 注意事项 字符串格式化程序的参数与 作用因此,不能在末尾添加逗号来转换字符串 到那里的元组

如果要同时插入多个值,可以使用或


我有以下意见:

VALUES子句需要在值%s中加括号 通过在SQL中使用不带引号的占位符并将值作为第二个参数传递,值的引用/转义应委托给游标的execute方法:cursor.executesql、tweet_text或cursor.executemanysql、[tweet_text1,,tweet_text2,] 一旦应用了这些步骤,就不需要编码/字符串化/正则化:假设twi_text是str,并且数据库的字符集/排序规则支持完整的UTF-8范围(例如utf8mb4),那么插入应该成功。 特别是,要避免先对str进行编码,然后对结果调用str:结果是b'my original string' 问题中代码的这个修改版本对我很有用:

导入mysql.connector DDL1=如果存在tweets\u lgbt,则删除表 DDL2=\ 创建表格tweets\u lgbt `text`VARCHAR 256 从…起https://twitter.com/AlisonMitchell/status/1332567013701500928?s=20 插入_tweet=\ 特别高兴看到@SarahStylesAU 这篇文章引用了她所做的工作
我有以下意见:

VALUES子句需要在值%s中加括号 通过在SQL中使用不带引号的占位符并将值作为第二个参数传递,值的引用/转义应委托给游标的execute方法:cursor.executesql、tweet_text或cursor.executemanysql、[tweet_text1,,tweet_text2,] 一旦应用了这些步骤,就不需要编码/字符串化/正则化:假设twi_text是str,并且数据库的字符集/排序规则支持完整的UTF-8范围(例如utf8mb4),那么插入应该成功。 特别是,要避免先对str进行编码,然后对结果调用str:结果是b'my original string' 问题中代码的这个修改版本对我很有用:

导入mysql.connector DDL1=如果存在tweets\u lgbt,则删除表 DDL2=\ 创建表格tweets\u lgbt `text`VARCHAR 256 从…起https://twitter.com/AlisonMitchell/ 状态/1332567013701500928?s=20 插入_tweet=\ 特别高兴看到@SarahStylesAU 这篇文章引用了她所做的工作
你的意思是在%insert_tweet之后,将报价留在末尾,未关闭吗?我要求不要吹毛求疵,但因为这种语法太奇怪了,我会相信。我有理由感到困惑:我认为元组是insert_tweet,逗号使其成为元组。我遗漏了什么明显的东西?在%之后出现的只是字符串格式化程序的参数。额外的逗号不会将传递到那里的任何内容转换为元组。如果insert_tweet已经是一个元组,那么它会给您预期的结果,但事实并非如此。是否有原因让您尝试使用字符串格式c.executestmt%值而不是首选参数替换c.executestmt,values,?snakecharmerb-我先尝试过,我已经尝试了Python字符串的所有格式模式。这是我最后一次尝试。你的意思是在%insert_tweet,unclosed之后将报价留在末尾吗?我要求不要吹毛求疵,但因为这种语法太奇怪了,我会相信。我有理由感到困惑:我认为元组是insert_tweet,逗号使其成为元组。我遗漏了什么明显的东西?在%之后出现的只是字符串格式化程序的参数。额外的逗号不会将传递到那里的任何内容转换为元组。如果insert_tweet已经是一个元组,那么它会给您预期的结果,但事实并非如此。是否有原因让您尝试使用字符串格式c.executestmt%值而不是首选参数替换c.executestmt,values,?snakecharmerb-我先尝试过,我已经尝试了Python字符串的所有格式模式。这只是我最后一次尝试。因此,这仍然不起作用-以下是我尝试的:对于迭代器中的项:如果项中的“text”:sql='USE hate_tweets'ms_cur.executesql insert_tweet=item['text']sql=insert INTO tweets_lgbt文本值“%s”;%将_tweet printsql ms_cur.executeINSERT插入到tweet_lgbt文本值“%s”;%插入_tweet printitem['text']要获取的标准响应:mysql.connector.errors.ProgrammingError:1064 42000:您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以获取正确的语法,以便使用near'S oching!!如果可以,请在请愿书上签名!很明显,从Tweet在错误中的起始位置来看,它仍然不能很好地处理撇号和其他保留字符。所以,这仍然不起作用-以下是我尝试的:对于迭代器中的项:如果项中的“text”:sql='USE hate_tweets'ms_cur.executesql insert_tweet=item['text']sql=insert INTO tweets_lgbt文本值“%s”;%将_tweet printsql ms_cur.executeINSERT插入到tweet_lgbt文本值“%s”;%插入_tweet printitem['text']要获取的标准响应:mysql.connector.errors.ProgrammingError:1064 42000:您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以获取正确的语法,以便使用near'S oching!!如果可以,请在请愿书上签名!很明显,从Tweet在该错误中的起始位置来看,它仍然不能很好地处理撇号和其他保留字符。