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