【问题标题】:to_sql "Incorrect syntax" error on inserting DataFrame to [schema].[table]to_sql 将 DataFrame 插入 [schema].[table] 时出现“语法错误”错误
【发布时间】:2020-11-03 20:03:34
【问题描述】:

我创建了 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文件中的列名是一样的。

【问题讨论】:

    标签: python sql-server pandas sqlalchemy pyodbc


    【解决方案1】:

    to_sql 期望第一个参数是只是 表名作为普通(未引用)字符串。如果您需要指定架构名称,则必须将其作为 schema= 参数传递,例如,

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2018-05-04
      • 2018-01-23
      • 1970-01-01
      相关资源
      最近更新 更多