如何在SQL查询中执行外部程序?

时间:2017-06-06 17:29:20

标签: python sql database sqlite sqlalchemy

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

我想要这样做的原因,以及我不能考虑其他方法的原因是,我的任务是使用SQLite和SQLAlchemy库(特别是这些基准:{{3)在Python中手动重新创建一些数据库基准测试。 }})。

其中一个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的总计数。

表"文件"包含一个名为" line"的列。它代表HTML的各个行。 " url_count.py"程序只是从sys.stdin中解析行并打印以制表符分隔的信息行(你可以在这里看到url_count.py:https://amplab.cs.berkeley.edu/benchmark/)。

我试图运行以下内容:

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的手册页也会非常有帮助。我对其他任何疑问都没有任何问题,所以我不知道为什么这个问题会变得如此令人头疼。

1 个答案:

答案 0 :(得分:0)

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

最近的机制是table-valued function,但Python >>> conn = sqlite3.connect(':memory:') >>> c = conn.cursor() >>> c.execute("CREATE table raman(ATOMIC NUMBER INT, SYMBOL TEXT, ROW INT , COLUMN INT)") <sqlite3.Cursor object at 0x000000000296E490> >>> c.execute("INSERT INTO raman VALUES(1,'H',1,'1')"); <sqlite3.Cursor object at 0x000000000296E490> >>> conn.commit() >>> for row in c.execute('SELECT * FROM raman'): ... row ... (1, 'H', 1, 1) 模块不会公开。

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