2017-06-06 25 views
0

我想弄清楚如何在SQL查询中嵌入对外部程序的调用。这个想法是,当SQL查询执行时,它将能够调用外部程序,传递数据库中的记录,并接收可以被该SQL查询使用的输出。如何执行外部程序作为SQL查询的一部分?

我想这样做的原因,而且我不能考虑其他方法,我的任务是使用SQLite和SQLAlchemy库手动重新创建一些数据库基准测试任务(特别是这些基准:https://amplab.cs.berkeley.edu/benchmark/) 。

CREATE TABLE url_counts_partial AS 
    SELECT TRANSFORM (line) 
    USING "python /root/url_count.py" as (sourcePage, destPage, cnt) 
    FROM documents; 

这里是他们的查询4的描述:

This query calls an external Python function which extracts and aggregates URL information from a web crawl dataset. It then aggregates a total count per URL.

表 “文件” 包含

一(查询4)上述SQL查询与下面的SQL语句开始一个名为“行”的列表示单行的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移动到本地目录。我试图执行完整的语句(即在“CREATE TABLE url_counts_partial AS”中加入)。我曾尝试在玩具数据库上运行它的简化版本。我也尝试用调用简单的bash命令来替换对python程序的调用。似乎没有任何工作。我似乎也无法找到关于TRANSFORM或USING关键字的任何联机文档。

我只是在某个地方犯了一个愚蠢的错误?或者,如果没有,是否有更容易/更正确的方式来执行此命令(同时仍忠于原始查询)?否则,即使只知道在哪里可以找到TRANSFORM或USING的手册页也会非常有帮助。我对他们的其他任何疑问都没有任何问题,所以我不知道为什么这个问题会变得如此令人头疼。

+0

你需要逃避你的单引号吗?你为什么试图从SQL运行程序?这通常指的是不适当的设计。 –

+0

一个好主意,但我试图逃避单引号,并没有帮助。我也尝试过双引号,都逃脱了,没有逃脱,都无济于事。如果我理解正确,两者都不应该要求在python中的三重引号之间转义,但可以肯定的是,我确实尝试了每个置换。 – SankharaDukkha

+0

为了回应我为什么要从SQL运行程序:因为我的任务是忠实地重新创建现有的基准测试,所以我必须遵循他们的设计。无论好坏,这是他们的设计,所以我需要效仿原来的基准。你可以阅读更多关于我在这里复制的基准:https://amplab.cs.berkeley.edu/benchmark/ – SankharaDukkha

回答

0

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

最接近的机制是table-valued function,但这不是由Python sqlite3模块公开的。

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