【问题标题】:Using the web2py DAL with temp tables将 web2py DAL 与临时表一起使用
【发布时间】:2025-12-28 05:30:16
【问题描述】:

我正在尝试通过 web2py DAL 对临时表执行一些原始 SQL,但我的结果都返回 None。

这是完整的功能:

def test():

    db_test = DAL('mysql://root:root@localhost/test')

    sql = """CREATE TEMPORARY TABLE tmp LIKE people;
    INSERT INTO tmp SELECT * FROM people;
    INSERT INTO tmp SELECT * FROM people;
    SELECT * FROM tmp;"""

    results = db_test.executesql(sql)

显然 SQL 是一种简化,但在 SQL 窗格中运行相同的 SQL 会返回正确的结果。我需要做什么才能让 DAL 使用它?

【问题讨论】:

    标签: python data-access-layer web2py


    【解决方案1】:

    你不能在一个executesql调用中执行多个语句我怀疑; web2py 使用 DBAPI 2.0 .execute() 调用将这些发送到后端数据库,通常只支持单个语句:

    db_test = DAL('mysql://root:root@localhost/test')
    
    sqlddl = """CREATE TEMPORARY TABLE tmp LIKE people;
    INSERT INTO tmp SELECT * FROM people;
    INSERT INTO tmp SELECT * FROM people;"""
    
    for statement in sqlddl.split(';'):
        db_test.executesql(statement.strip())
    
    sqlselect = "SELECT * FROM tmp;"
    results = db_test.executesql(sqlselect)
    

    【讨论】:

    • 谢谢,但我刚刚尝试过,结果相同——仍然返回None
    • 不得不说我对web2py非常警惕;一方面,无论结果集大小如何,它都会执行fetchall()。如果您的结果集足够大,这很容易导致内存问题。
    • 感谢更新 - 多次执行可能是问题所在,所以我通过将其滚动到存储过程中解决了这个问题。
    • 顺便说一句-至于对 web2py 保持警惕,不知道为什么-这是一个具有强大 DAL 的出色框架。你关于fetchall() 的观点我不知道,但似乎是儿童安全细节,而不是忽略框架。
    • 是的,但您不必自己安装所有车轮,也不必在不同的服务站进行维修。其中一些比现有的车轮跑得更快,操控性更好。 :-)