【问题标题】:pandas to sql server熊猫到 sql 服务器
【发布时间】:2016-07-28 23:34:48
【问题描述】:

我得到以下代码。问题是我可以使用 panda.read_sql 读取数据,但我无法使用 DataFrame.to_sql() 函数。

%matplotlib inline
import pandas as pd
import pyodbc
from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt

pd.set_option('display.max_rows', 50)
pd.set_option('display.max_columns', 15)
pd.set_option('precision', 4)

conn = pyodbc.connect(r"Driver={SQL Server};Server=dev;Database=test1")

data = pd.read_sql_query(
    """
SELECT *
FROM   sys.tables
    """
    , con = conn)

print data
data.to_sql('test', con = conn)

错误如下:

sql 'SELECT name FROM sqlite_master WHERE 执行失败 type='table' AND name=?;': ('42S02', "[42S02] [Microsoft][ODBC SQL 服务器驱动程序][SQL Server]无效的对象名称“sqlite_master”。 (208) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server 驱动程序][SQL 服务器]无法准备语句。 (8180)")

有办法绕过去吗?

【问题讨论】:

  • test 表是否存在于dbo 模式的数据库中?如果不使用if_exists 参数替换/追加。默认为失败。
  • @Parfait 我使用了替换选项,它给出了同样的错误。
  • pandas to_sql不支持直接连接MS SQL Server,需要使用sqlalchemy连接如@Parfait的回答所示

标签: python sql sql-server pandas


【解决方案1】:

考虑创建一个 sqlalchemy MSSQL engine 并在 pandas to_sql() con 参数中使用它:

import sqlalchemy

...
engine = sqlalchemy.create_engine(
               "mssql+pyodbc://user:pwd@server/database",
               echo=False)

data.to_sql('test', con=engine, if_exists='replace')

【讨论】:

  • 如果每个 DB 有多个模式,则表由 [MySchemaName].[MyTableName] 标识。架构可以作为参数传递给 to_sql,例如:my_dataframe.to_sql(name='MyTableName', con=engine, if_exists='replace', schema='MySchemaName'),如果我没有传递架构,那么它对我不起作用。对我有用的连接字符串也有这种格式:"mssql+pyodbc:///?odbc_connect={}".format(urllib.parse.quote_plus("DRIVER=ODBC Driver 13 for SQL Server;SERVER={0};PORT=1433;DATABASE={1};UID={2};PWD={3};TDS_Version=8.0;".format(server, database, user, password)))
  • @TPPZ ...感谢您的说明,未来的读者将不胜感激。
  • @TPPZ 我花了将近一个小时试图通过sqlalchemy 使用pandas 的to_sql 解决将数据帧写入MSSQL 的问题,而您的评论是唯一能处理我需要的所有信息的评论。非常感谢你终于拯救了我的夜晚!
猜你喜欢
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
相关资源
最近更新 更多