使用DuckDB查询类成员变量

问题描述 投票:0回答:1

我有一个带有 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 获取类成员,或者它只适用于局部变量?

python pandas duckdb
1个回答
0
投票

您遇到的问题与 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 查询就可以引用这个临时表。

有效果吗?

© www.soinside.com 2019 - 2024. All rights reserved.