Python 如何作为SQL查询的一部分执行外部程序?

Python 如何作为SQL查询的一部分执行外部程序?,python,sql,database,sqlite,sqlalchemy,Python,Sql,Database,Sqlite,Sqlalchemy,我试图弄清楚如何在SQL查询中嵌入对外部程序的调用。其思想是,当SQL查询执行时,它将能够调用外部程序,传递数据库中的记录,并接收SQL查询可以使用的输出 我之所以要这么做,而我不能考虑替代方法,是因为我一直在用Python手工重新创建一些数据库基准,使用SQLite和SQLalCyMy库(特别是这些基准:)。 此处描述的其中一个SQL查询(查询4)以以下SQL语句开头: CREATE TABLE url_counts_partial AS SELECT TRANSFORM (line)

我试图弄清楚如何在SQL查询中嵌入对外部程序的调用。其思想是,当SQL查询执行时,它将能够调用外部程序,传递数据库中的记录,并接收SQL查询可以使用的输出

我之所以要这么做,而我不能考虑替代方法,是因为我一直在用Python手工重新创建一些数据库基准,使用SQLite和SQLalCyMy库(特别是这些基准:)。 此处描述的其中一个SQL查询(查询4)以以下SQL语句开头:

CREATE TABLE url_counts_partial AS 
  SELECT TRANSFORM (line)
    USING "python /root/url_count.py" as (sourcePage, destPage, cnt) 
  FROM documents;
以下是他们对问题4的描述:

此查询调用一个外部Python函数,该函数从web爬网数据集中提取和聚合URL信息。然后它聚合每个URL的总计数

表“documents”包含一个名为“line”的列,它表示HTML的各个行。“url_count.py”程序只需解析sys.stdin中的行,并打印制表符分隔的行信息(您可以在此处看到url_count.py:)

我尝试运行以下程序:

from sqlalchemy import create_engine
engine = create_engine('sqlite:///myDatabase.db')

result = engine.execute("""SELECT TRANSFORM (line) 
             USING 'python /root/url_count.py' as (sourcePage, destPage, cnt)
             FROM documents"""")
但是,每次我尝试运行此程序时,都会遇到一个异常,底部有一个关于语法错误的投诉:

sqlalchemy.exc.OperationalError: (OperationalError) near "USING": syntax error
我试着用我能想到的各种方法来调整语法。我已尝试将url_count.py移动到本地目录。我已尝试执行完整语句(即在“createtableurl\u counts\u partial AS”中添加回)。我试过在toy数据库上运行它的简化版本。我还尝试用对简单bash命令的调用替换对python程序的调用。似乎什么都不管用。我似乎也找不到任何关于关键字转换或使用的在线文档


我只是在某个地方犯了个愚蠢的错误吗?或者,如果没有,是否有更简单/更正确的方法来执行此命令(同时仍然忠实于原始查询)?如果做不到这一点,即使只是知道在哪里可以找到要转换或使用的手册页也会非常有帮助。我对他们的任何其他查询都没有任何问题,所以我不知道为什么这个查询会如此令人头痛。

SQLite没有这样的USING子句来调用外部程序

最近的机制可能是,但Python
sqlite3
模块没有公开这一机制


最简单的方法是手动执行该程序,并将其输出转换为INSERT命令。

是否需要转义单引号?为什么要尝试从SQL运行程序?这通常指向某个地方的设计不当。这是一个好主意,但我试图避开单引号,但没有任何帮助。我还尝试了双引号,包括转义和未转义,但都没有用。如果我理解正确的话,这两种方法都不需要在python中的三重引号之间转义,但为了确保这一点,我确实尝试了每一种排列方式。作为对我尝试从SQL运行程序的原因的回应:由于我的任务是忠实地重新创建现有基准,我必须遵循它们的设计。不管是好是坏,这就是他们所采用的设计,因此为了忠实于原始基准,我需要效仿。你可以阅读更多关于我在这里复制的基准测试: