【问题标题】:SQLAlchemy/pandas to_sql for SQLServer -- CREATE TABLE in master db用于 SQLServer 的 SQLAlchemy/pandas to_sql -- 在主数据库中创建表
【发布时间】:2015-10-18 11:30:32
【问题描述】:

使用 MSSQL(2012 版),我使用 SQLAlchemy 和 pandas(在 Python 2.7 上)将行插入到 SQL Server 表中。

在尝试使用特定服务器字符串的 pymssql 和 pyodbc 之后,我正在尝试使用 odbc 名称:

import sqlalchemy, pyodbc, pandas as pd

engine = sqlalchemy.create_engine("mssql+pyodbc://mssqlodbc")
sqlstring = "EXEC getfoo"
dbdataframe = pd.read_sql(sqlstring, engine)

这部分效果很好,并且可以与其他方法(pymssql 等)一起使用。但是,pandas to_sql 方法不起作用。

finaloutput.to_sql("MyDB.dbo.Loader_foo",engine,if_exists="append",chunksize="10000")

使用此语句,我得到一个一致的错误,即 pandas 正在尝试在 sql server Master db 中执行 CREATE TABLE,这是不允许的。

如何让 pandas/SQLAlchemy/pyodbc 指向正确的 mssql 数据库? to_sql 方法似乎忽略了我在引擎连接字符串中放入的任何内容(尽管 read_sql 方法似乎可以很好地提取它。

【问题讨论】:

  • 你用的是什么版本的熊猫?您可以尝试将表名指定为Loader_foo 吗? (带点的名称将作为表名整体使用,如果要指定架构有schema关键字)
  • 嗨@joris,我正在使用pandas 0.16.2。您删除虚线名称的提示(从 MyDB.dbo.Loader_foo 切换到 Loader_foo 有效,谢谢。此外,我可以在 DSN 和直接服务器名称之间切换,并且它可以工作。谢谢!
  • 顺便说一句,chunksize 参数需要一个 int,而不是字符串 -> chunksize=10000

标签: python sql-server pandas sqlalchemy


【解决方案1】:

要回答这个问题:问题在于您在表名本身中指定了架构。如果您提供"MyDB.dbo.Loader_foo" 作为表名,pandas 会将这个完整的字符串解释为表名,而不仅仅是"Loader_foo"

解决方案是只提供"Loader_foo" 作为表名。如果你需要指定一个特定的模式来写入这个表,你可以使用schema kwarg(见docs):

finaloutput.to_sql("Loader_foo", engine, if_exists="append")
finaloutput.to_sql("Loader_foo", engine, if_exists="append", schema="something_else_as_dbo")

【讨论】:

  • 感谢@joris...也将chunksize 捕获为int。
猜你喜欢
  • 1970-01-01
  • 2015-08-18
  • 2022-01-09
  • 2015-09-01
  • 2019-04-17
  • 2022-06-22
  • 2015-02-17
  • 2015-06-03
  • 2017-08-01
相关资源
最近更新 更多