使用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主数据库中执行CREATE TABLE,它不会被禁止使用。
如何让pandas / SQLAlchemy / pyodbc指向正确的mssql数据库? to_sql方法似乎忽略了我在引擎连接字符串中放置的内容(虽然read_sql方法似乎很好地接受它。
答案 0 :(得分:3)
要回答这个问题:问题是您在表名本身中指定了架构。如果您提供"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")