PyMySQL 错误:“str”对象没有属性“to_sql”

Posted

技术标签:

【中文标题】PyMySQL 错误:“str”对象没有属性“to_sql”【英文标题】:PyMySQL Error: 'str' object has no attribute 'to_sql' 【发布时间】:2018-02-08 16:45:38 【问题描述】:

我是编码新手,这是我的第一个项目。到目前为止,我已经通过谷歌搜索、教程和堆栈拼凑了我所拥有的东西。

我正在尝试将数据从抓取的 RSS 提要的 pandas df 添加到远程 sql 数据库。我一直在使用 this post 和 this post 的组合来修复我的错误,但答案似乎不适用于我的问题。

有没有人可以解决这个错误:


AttributeError Traceback(最近调用 最后)在() 19 游标.执行(sql) 20 ---> 21 sql.to_sql(df, con=conn, name='rsstracker', if_exists='append', flavor='mysql') 22 23 # 断开与服务器的连接

AttributeError: 'str' 对象没有属性 'to_sql'

import pandas as pd
from pandas.io import sql
import feedparser
import time

rawrss = ['http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml',
          'https://www.yahoo.com/news/rss/',
          'http://www.huffingtonpost.co.uk/feeds/index.xml',
          'http://feeds.feedburner.com/TechCrunch/',
         ]

posts = []
for url in rawrss:
    feed = feedparser.parse(url)
    for post in feed.entries:
        posts.append((post.title, post.link, post.summary))
df = pd.DataFrame(posts, columns=['title', 'link', 'summary']) # pass data to init

import pymysql

# Open database connection
db = pymysql.connect(host="host", port=##, user="username", password="password", db="sql#######" )

# prepare a cursor object using cursor() method
cursor = db.cursor()


# Drop table if it already exist using execute() method.
cursor.execute("DROP TABLE IF EXISTS rsstracker")

# Create table as per requirement
sql = """CREATE TABLE rsstracker(
   article_title  varchar(255),
   article_url  varchar(1000),
   article_summary varchar(1000))"""

cursor.execute(sql)

sql.to_sql(df, con=conn, name='rsstracker', if_exists='append', flavor='mysql')

# disconnect from server
db.close()

【问题讨论】:

错误似乎很清楚,因为to_sql 是一种熊猫数据框方法,但您是在 sql 字符串上运行它 【参考方案1】:

该行应该是:

df.to_sql(con=db, name='rsstracker', if_exists='append', flavor='mysql')

但您可能需要使用 SQLAlchemy 才能进行此导出 (doc)


您可以尝试将 SQLAlchemy 与 pymysql 一起使用,如下所示:

import pymysql
from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://<username>:<password>@<host>[:<port>]/<dbname>')
engine.execute("DROP TABLE IF EXISTS rsstracker")
engine.execute("""CREATE TABLE rsstracker(
   article_title  varchar(255),
   article_url  varchar(1000),
   article_summary varchar(1000))""")


df.to_sql(con=engine, name='rsstracker', if_exists='append', , flavor='mysql')

【讨论】:

我试过这个,现在得到错误:'ValueError: database flavor mysql is not supported' 为什么你认为我可能需要 SQLAlchemy?我处理问题的方式有问题吗? 似乎不支持其他风格,所以我想你应该切换到 SQLAlchemy,或者用另一种方式从数据框中导出数据 我是否将 'pymysql' 与 'SQLAlchemy' 交换? @NickDuddy,您可以尝试使用编辑后的解决方案吗? 刚刚将 '@[:]' 更改为 '@:'。现在得到一个不同的错误:'UnicodeEncodeError: 'latin-1' codec can't encode character '\u2013' in position 151: ordinal not in range(256)'

以上是关于PyMySQL 错误:“str”对象没有属性“to_sql”的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的单元测试因错误“str”对象没有属性“光标”而失败?

检查是不是已创建另一个具有相同名称的 DataFrame。错误:“str”对象没有属性“append”

django 2 中的迁移错误; AttributeError:“str”对象没有属性“decode”

我遇到错误:AttributeError:'str'对象没有属性'isfloat'

AttributeError:“str”对象在 Seaborn、散点图中没有属性“view”

“AttributeError:‘str’对象没有属性‘descendants’错误,使用 bs4 和 selenium 进行自动抓取