熊猫到SQL Seriver

JOH*_*OHN 1 python sql sql-server pandas

我得到以下代码。问题是我可以使用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)
Run Code Online (Sandbox Code Playgroud)

错误如下:

在SQL'SELECT name FROM sqlite_master WHERE type ='table'AND name = ?;'上执行失败:('42S02',“ [42S02] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]无效的对象名'sqlite_master' 。(208)(SQLExecDirectW); [42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]声明无法准备。(8180)“)

有办法解决吗?

Par*_*ait 5

考虑创建一个sqlalchemy MSSQL引擎,并在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')
Run Code Online (Sandbox Code Playgroud)

  • 如果每个数据库有多个架构,则该表由 `[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)))` (3认同)
  • @TPPZ ...感谢您的留言,未来的读者将会欣赏。 (2认同)
  • @TPPZ 我花了将近一个小时试图解决通过“sqlalchemy”使用 pandas 的“to_sql”将数据帧写入 MSSQL 的问题,而您的评论是唯一可以处理我需要的所有信息的评论。非常感谢你终于拯救了我的夜晚! (2认同)