Вставить таблицу Python DuckDB в оператор SQL

Я пытаюсь использовать зарегистрированную виртуальную таблицу в качестве таблицы в операторе 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, который я пытаюсь использовать в качестве фильтра из запроса к базе данных. В конечном итоге это сформируется в несколько критериев из одной и той же таблицы: даты, доход и идентификаторы среди прочего.
Честно говоря, я удивлен, что у меня так много проблем с этим. В SAS с PROC SQL это так просто, но я не могу заставить фрейм данных взаимодействовать с параметрами SQL так, как мне нужно. Я делаю синтаксическую ошибку?
Самая распространенная ошибка: «UFuncTypeError: ufunc 'add' не содержал цикла с типами сопоставления подписи (dtype ('<U55'), dtype ('<U55')) -> dtype ('<U55')», но типы такие же.

1 ответ

Похоже, вы вставляете содержимое 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 here is your
UNION ALL query "[здесь исходный запрос UNION ...

Другие вопросы по тегам