试图将熊猫数据框插入临时表
Posted
技术标签:
【中文标题】试图将熊猫数据框插入临时表【英文标题】:Trying to insert pandas dataframe to temporary table 【发布时间】:2019-08-22 19:02:21 【问题描述】:我正在寻找创建一个临时表并在其中插入一些数据。我已经广泛使用 pyodbc 来提取数据,但我不熟悉从 python 环境将数据写入 SQL。我在工作中这样做,所以我没有能力创建表,但我可以创建临时表和全局临时表。我的意图是将一个相对较小的数据帧(150rows x 4cols)插入一个临时表并在我的整个会话中引用它,我的程序结构使得会话中的全局变量不够用。尝试时出现以下错误下面这一段,我做错了什么?
pyodbc.ProgrammingError: ('42S02', "[42S02] [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'sqlite_master'. (208) (SQLExecDirectW); [42S02] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. (8180)")
import numpy as np
import pandas as pd
import pyodbc
conn = pyodbc.connect('Driver=SQL Server;'
'Server=SERVER;'
'Database=DATABASE;'
'Trusted_Connection=yes;')
cursor = conn.cursor()
temp_creator = '''CREATE TABLE #rankings (Col1 int, Col2 int)'''
cursor.execute(temp_creator)
df_insert = pd.DataFrame('Col1' : [1, 2, 3], 'Col2':[4,5,6])
df_insert.to_sql(r'#rankings', conn, if_exists='append')
read_query = '''SELECT * FROM #rankings'''
df_back = pd.read_sql(read_query,conn)
【问题讨论】:
在 Windows 上吗? 是的,这是 Windows 操作系统 我会尝试 DSN 连接。这可能是最简单的方法。其他方法可能需要一些时间来尝试。检查文档以获取说明。 github.com/mkleehammer/pyodbc/wiki/… 我并不担心连接是否正常,我已经测试了这段代码,唯一失败的行是 df_insert.to_sql(r'#rankings', conn, if_exists='append' ),我可以创建临时表并从中读取,但我无法插入我的数据框 对不起,插入需要使用sqlalchemy
。检查***.com/questions/25661754/…
【参考方案1】:
Pandas.to_sql 在那里失败了。但是对于 SQL Server 2016+/Azure SQL 数据库,无论如何都有更好的方法。无需让 pandas 插入每一行,而是以 JSON 格式将整个数据帧发送到服务器并将其插入到单个语句中。像这样:
import numpy as np
import pandas as pd
import pyodbc
conn = pyodbc.connect('Driver=Sql Server;'
'Server=localhost;'
'Database=tempdb;'
'Trusted_Connection=yes;')
cursor = conn.cursor()
temp_creator = '''CREATE TABLE #rankings (Col1 int, Col2 int);'''
cursor.execute(temp_creator)
df_insert = pd.DataFrame('Col1' : [1, 2, 3], 'Col2':[4,5,6])
df_json = df_insert.to_json(orient='records')
print(df_json)
load_df = """\
insert into #rankings(Col1, Col2)
select Col1, Col2
from openjson(?)
with
(
Col1 int '$.Col1',
Col2 int '$.Col2'
);
"""
cursor.execute(load_df,df_json)
#df_insert.to_sql(r'#rankings', conn, if_exists='append')
read_query = '''SELECT * FROM #rankings'''
df_back = pd.read_sql(read_query,conn)
print(df_back)
哪个输出
["Col1":1,"Col2":4,"Col1":2,"Col2":5,"Col1":3,"Col2":6]
Col1 Col2
0 1 4
1 2 5
2 3 6
Press any key to continue . . .
【讨论】:
甲骨文呢?这也是最好的方法吗? 你应该在一个单独的问题中用 [oracle] 标签提出这个问题,可能知道答案的人会看到这个问题。以上是关于试图将熊猫数据框插入临时表的主要内容,如果未能解决你的问题,请参考以下文章