Нельзя использовать точечную запись в параметре name=
. Просто используйте name=tablename
. Другие части в порядке.
Если вам нужно назначить схему не по умолчанию (dbo
), для df.to_sql()
есть параметр schema=
. Префикс database.
является избыточным, потому что вы уже присвоили dbname
в движке.
Протестировано с SQL Server 2017 (последний docker образ в Debian 10) и anaconda python 3.7.
Тестовый код
SQL Серверная часть (создать пустую таблицу)
use testdb;
go
if OBJECT_ID('testdb..test') is not null
drop table test;
create table test (
[Brand] varchar(max),
[Price] money
);
Python part
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 |