SQLalchemy добавляет фрейм данных к существующей SQL таблице серверов - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь добавить два столбца из кадра данных в существующую таблицу SQL сервера. Код выполняется, но когда я запрашиваю таблицу SQL, дополнительные строки отсутствуют. Чего мне не хватает?

import sqlalchemy
engine = sqlalchemy.create_engine("mssql+pyodbc://user:pw@host:port/dbname?driver=ODBC+Driver+13+for+SQL+Server")

df.to_sql(name='database.tablename', con=engine, if_exists='append', index=False)

1 Ответ

1 голос
/ 11 марта 2020

Нельзя использовать точечную запись в параметре 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 |
...