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)
但我总是遇到这些错误:
如果我将 con = engine.raw_connection()
传递给 to_sql()
,我将得到:
- DatabaseError: sql 'SELECT name FROM 执行失败
sqlite_master WHERE type='table' AND name=?;': 并非所有参数
在字符串格式化期间转换
如果我使用 con = engine.connect()
,并传递给 read_sql()
,我会得到错误:
- AttributeError: 'Connection' 对象没有属性 'cursor'
如果我将 engine
传递给 to_sql()
和 read_sql()
,我将得到:
- AttributeError: 'Engine' 对象没有属性 'cursor'
我该怎么办?
你必须从其给定值 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')]
符合预期
我有一个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)
但我总是遇到这些错误:
如果我将
con = engine.raw_connection()
传递给to_sql()
,我将得到:- DatabaseError: sql 'SELECT name FROM 执行失败 sqlite_master WHERE type='table' AND name=?;': 并非所有参数 在字符串格式化期间转换
如果我使用
con = engine.connect()
,并传递给read_sql()
,我会得到错误:- AttributeError: 'Connection' 对象没有属性 'cursor'
如果我将
engine
传递给to_sql()
和read_sql()
,我将得到:- AttributeError: 'Engine' 对象没有属性 'cursor'
我该怎么办?
你必须从其给定值 n-1
中输入 list.string.sqlpandas.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')]
符合预期