您不能在name= 参数中使用点表示法。只需使用name=tablename。其他部分都很好。
如果您需要分配非默认 (dbo) 架构,df.to_sql() 有一个 schema= 参数。前缀database. 是多余的,因为您已经在引擎中分配了dbname。
使用 SQL Server 2017(debian 10 上的最新 docker 映像)和 anaconda python 3.7 进行测试。
测试代码
SQL Server 部分(创建一个空表)
use testdb;
go
if OBJECT_ID('testdb..test') is not null
drop table test;
create table test (
[Brand] varchar(max),
[Price] money
);
Python部分
from pandas import DataFrame
import sqlalchemy
# check your driver string
# import pyodbc
# pyodbc.drivers() # ['ODBC Driver 17 for SQL Server']
# connect
eng = sqlalchemy.create_engine("mssql+pyodbc://myid:mypw@localhost:1433/testdb?driver=ODBC+Driver+17+for+SQL+Server")
df = DataFrame(
data={'Brand': ['A','B','C'],
'Price': [10.00, 20.00, 30.00]},
columns=['Brand', 'Price']
)
df.to_sql(name="test", schema="dbo", con=eng, if_exists="append", index=False)
结果
select * from [test]
| Brand | Price |
|-------|---------|
| A | 10.0000 |
| B | 20.0000 |
| C | 30.0000 |