0

我正在尝试使用已注册的虚拟表作为 SQL 语句中的表,并使用与另一个数据库的连接。我不能只是将列转换为字符串并使用它,我需要表/数据框本身在语句中工作并与 SQL 语句中的其他表连接。我正在一个 Access 数据库上尝试这个来启动。这是我到目前为止所拥有的:

import pyodbc
import pandas as pd
import duckdb
conn = duckdb.connect()

starterset = pd.read_excel (r'e:\Data Analytics\Python_Projects\Applications\DB_Test.xlsx')

conn.register("test_starter", starterset)
IDS = conn.execute("SELECT * FROM test_starter WHERE ProjectID > 1").fetchdf()

StartDate = '1/1/2015'
EndDate = '12/1/2021'

# establish the connection
connt = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=E:\Databases\Offline.accdb;')
cursor = conn.cursor()

# Run the query
query = ("Select ProjectID, Revenue, ClosedDate from Projects INNER JOIN " + IDS + " Z on Z.ProjectID = Projects.ProjectID "
"where ClosedDate between #" + StartDate + "# and #" + EndDate + "# AND Revenue > 0 order by ClosedDate")
sfd
df = pd.read_sql(query, connt)
    
df.to_excel(r'TEMP.xlsx', index=False)
os.system("start EXCEL.EXE TEMP.xlsx")

# Close the connection
cursor.close()
connt.close()

我在 Excel 工作表中有一个 ID 列表,我试图将其用作数据库查询的过滤器。最终,这将形成同一张表中的几个标准:日期、收入和 ID 等。
老实说,我很惊讶我在做这件事时遇到了这么多麻烦。在 SAS 中,使用 PROC SQL 非常简单,但我无法获得一个数据框来按照我的需要在 SQL 参数中进行接口。我犯了语法错误吗?
迄今为止最常见的错误是“UFuncTypeError: ufunc 'add' 不包含带有签名匹配类型的循环 (dtype('<U55'), dtype('<U55')) -> dtype('<U55')”,但类型是相同的。

4

1 回答 1

0

看起来您正在将 DataFrame 的内容推送到 Access 数据库查询中。我认为在 Pandas 中没有本地方法可以做到这一点。我使用的技术是特定于数据库供应商的,但我只是将文本字符串构建为 CTE/WITH 子句或临时表。例如:"""WITH my_data as (SELECT 'raw_text_within_df' as df_column1, 'raw_text_within_df' as df_column2
UNION ALL SELECT 'raw_text_within_df' as df_column1, 'raw_text_within_df' as df_column2
UNION ALL ...) [您的原始查询] """

于 2021-10-04T14:26:35.817 回答