我有一个带有 API 的代码库,用于传递 SQL 查询以运行执行,但该 API 不提供传递变量的方法。这意味着我无法在与查询运行的范围相同的范围内传递变量:
class SampleClientClass(BaseExecutionAPI):
def __init__(self):
self.conn = duckdb.DuckDBPyConnection()
def _execute_queries(self):
qs = self._yield_queries()
for q in qs:
self.conn.sql(q)
def _yield_queries(self):
...
我尝试将其作为类成员传递(因为我无法覆盖或更改
_execute_queries
方法),但这似乎不起作用:
class MyTableCreationClass(BaseExecutionAPI):
def __init__(self, df: pd.DataFrame):
self.conn = duckdb.DuckDBPyConnection()
self.my_df = df
def _execute_queries(self):
qs = self._yield_queries()
for q in qs:
self.conn.sql(q)
def _yield_queries(self):
return [
f"""
INSERT INTO my_table BY NAME
SELECT * FROM \"self.my_df\"
"""
]
这给了我错误:
Table with name self.my_df does not exist!
有没有办法让 DuckDB 获取类成员,或者它只适用于局部变量?
您遇到的问题与 DuckDB 如何与 Python 变量和类成员交互有关。 DuckDB 不会自动访问 SQL 查询中的 Python 变量或类成员。
DuckDB 提供了
from_df
函数,允许您从 pandas DataFrame 创建临时表。您可以使用此方法使您的 DataFrame 在 SQL 查询中可访问:
class MyTableCreationClass(BaseExecutionAPI):
def __init__(self, df: pd.DataFrame):
self.conn = duckdb.DuckDBPyConnection()
self.my_df = df
def _execute_queries(self):
# Create a temporary table from the DataFrame
self.conn.execute("CREATE TEMPORARY TABLE temp_df AS SELECT * FROM self.my_df")
qs = self._yield_queries()
for q in qs:
self.conn.sql(q)
# Optionally, drop the temporary table after use
self.conn.execute("DROP TABLE IF EXISTS temp_df")
def _yield_queries(self):
return [
"""
INSERT INTO my_table BY NAME
SELECT * FROM temp_df
"""
]
在这种方法中,我们在执行查询之前从
temp_df
创建一个临时表 self.my_df
。然后 SQL 查询就可以引用这个临时表。
有效果吗?