to_ sql Ошибка «Неверный синтаксис» при вставке DataFrame в [схему]. [таблица] - PullRequest
0 голосов
/ 14 июля 2020

Я создал соединение SQLAlchemy, которое отлично работает:

import urllib
import sqlalchemy as sqlalchemy
import pandas as pd
params = urllib.parse.quote_plus("DRIVER={SQL Server};"
                                 "SERVER="
                                 'Database=CProject;'
                                 'Trusted_Connection=yes;')

engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params))

, но когда я использую приведенный ниже код для вставки данных в фрейм данных, выдается ошибка.

df = pd.read_excel('june.xlsx')
df.to_sql(name = 'CProject.[Source].[NEP-7]',if_exists='append',con = engine, index=False)

Ошибка:

ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] 
[Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'VARCHAR'. (102) (SQLExecDirectW)")
[SQL: 


CREATE TABLE [CSOProjects.[Source].[NEC-7-11]] (
    number VARCHAR(max) NULL, 
    assigned_to VARCHAR(max) NULL, 
    [caller_id#user_name] VARCHAR(max) NULL, 
    state VARCHAR(max) NULL, 
    assignment_group VARCHAR(max) NULL, 
    business_duration BIGINT NULL, 
    business_service VARCHAR(max) NULL, 
    category VARCHAR(max) NULL, 
    u_category_structure VARCHAR(max) NULL, 
    u_resolution_ci VARCHAR(max) NULL, 
    resolved_by VARCHAR(max) NULL, 
    u_resolver_group VARCHAR(max) NULL, 
    u_service_provider VARCHAR(max) NULL, 
    sys_created_on DATETIME NULL, 
    caller_id VARCHAR(max) NULL, 
    u_caller_first_name VARCHAR(max) NULL, 
    u_caller_last_name VARCHAR(max) NULL, 
    u_vendor_category VARCHAR(max) NULL, 
    rfc FLOAT(53) NULL, 
    closed_at DATETIME NULL, 
    closed_by VARCHAR(max) NULL, 
    contact_type VARCHAR(max) NULL, 
    sys_created_by VARCHAR(max) NULL, 
    u_customer_portal_state VARCHAR(max) NULL, 
    description VARCHAR(max) NULL, 
    u_first_call_resolution VARCHAR(max) NULL, 
    u_first_time_fix BIT NULL, 
    impact VARCHAR(max) NULL, 
    u_incident_age VARCHAR(max) NULL, 
    knowledge BIT NULL, 
    reopened_by VARCHAR(max) NULL, 
    location VARCHAR(max) NULL, 
    u_on_behalf_of VARCHAR(max) NULL, 
    opened_at DATETIME NULL, 
    opened_by VARCHAR(max) NULL, 
    priority VARCHAR(max) NULL, 
    reassignment_count BIGINT NULL, 
    u_resolution_method VARCHAR(max) NULL, 
    close_code VARCHAR(max) NULL, 
    close_notes VARCHAR(max) NULL, 
    calendar_stc FLOAT(53) NULL, 
    resolved_at DATETIME NULL, 
    u_sd_esclation VARCHAR(max) NULL, 
    sla_due FLOAT(53) NULL, 
    severity VARCHAR(max) NULL, 
    short_description VARCHAR(max) NULL, 
    reopen_count BIGINT NULL, 
    subcategory VARCHAR(max) NULL, 
    sys_updated_by VARCHAR(max) NULL, 
    urgency VARCHAR(max) NULL, 
    sys_updated_on DATETIME NULL, 
    [assigned_to#active] BIT NULL
)
]

(Справочная информация об этой ошибке: http://sqlalche.me/e/f405)

Примечание. Имена столбцов в базе данных и файле Excel совпадают.

1 Ответ

1 голос
/ 20 июля 2020

to_sql ожидает, что первым аргументом будет просто имя таблицы в виде простой (не заключенной в кавычки) строки. Если вам нужно указать имя схемы, вы должны передать его как аргумент schema=, например,

df.to_sql(name='NEP-7', con=engine, schema='CProject.[Source]', ...
...