DatabaseError : “not all arguments converted during string formatting” when I use pandas.io.sql.to_sql()

DatabaseError : “not all arguments converted during string formatting” when I use pandas.io.sql.to_sql()

我有一个table:

并且我尝试使用这个 import this table by sqlalchemy ,代码是:

import sqlalchemy as db
import pandas.io.sql as sql

username = 'root'     
password = 'root'     
host = 'localhost'    
port = '3306'         
database = 'classicmodels'   

engine = db.create_engine(f'mysql+pymysql://{username}:{password}@{host}:{port}/{database}')

con = engine.raw_connection() 

#readinto dataframe
df = pd.read_sql(f'SELECT * FROM `{database}`.`offices`;', con)
print(df[:2])
df_append = pd.DataFrame([{'officeCode': 8,'city':'Taipei',
                           'phone':'1234567891','addressLine1':'Taipei DaAn',
                           'addressLine2':'Taipei DaAn2','state':'Taipei',
                           'country':'Taiwan','postalCode':'123','territory':'Asia'}])
df2 = pd.concat([df,df_append],ignore_index=True)
sql.to_sql(frame = df2, name='proj55.address_book5',con=con, if_exists='append',index=False)

但我总是遇到这些错误:

我该怎么办?

你必须从其给定值 n-1

中输入 list.string.sql

pandas.read_sql 使用:

  • 一个sqlalchemy连接对象engine.connect()
  • 一个数据库api对象仅适用于sqlite

通过使用 raw_connection(),你有一个 db api 连接对象,所以 pandas 认为它是一个到 sqlite 数据库的连接(正如我们在你的错误 FROM sqlite_master WHERE )

你需要使用con = engine.connect()

import sqlalchemy
import pandas
engine = sqlalchemy.create_engine('...')
with engine.connect() as conn:
    print('sqla:', list(conn.execute('select * from users')))
    df = pandas.read_sql('select * from users', conn)
    print('df:', df)
    df.to_sql('users2', conn)
    print('sqla:', list(engine.connect().execute('select * from users2')))

输出:

sqla: [(1, 'toto'), (2, 'titi'), (3, 'tutu'), (4, 'tata')]
df:    id  name
0   1  toto
1   2  titi
2   3  tutu
3   4  tata
sqla: [(1, 'toto'), (2, 'titi'), (3, 'tutu'), (4, 'tata')]

符合预期