Python Open Replace传递用于在SQL中创建表的变量,导致错误“DDL后只有ET或Null语句合法”

2024-06-16 10:45:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将变量传递到多个Teradata SQL文件中。当文件中没有“创建表”时,我有几个脚本可以很好地完成这项工作。当我运行带有硬编码变量的文件时,它们运行得很好,但是当我使用open/replace函数时,我得到一个错误“只有et或null语句在ddl语句之后才是合法的”

这告诉我是“Open().Replace()”函数导致了这种情况。这似乎导致python以并行方式而不是串行方式运行SQL脚本,但我不知道如何解释这一点。我试图在execute游标之外使用open/replace,但是由于变量没有被更改,它出现了错误。下面我有一些针对这个问题简化的代码示例。这是我第一次发布问题,如果有更好的方法,请随时发表评论,以便我可以进行编辑

test.sql不带变量

create multiset volatile table sdates as (Sel caldt, datesk from dimdates where day = 'Mon' and mth = 'Feb'); ins into vartest (Sel caldt, site, sum(sales) from fctsales f join sdates s on f.datesk = s.datesk);

有效的python代码

query = cur.execute(file = 'test.sql')

带变量的test.sql

create multiset volatile table sdates as (Sel caldt, datesk from dimdates where day = 'bbbb' and mth = 'oooo'); ins into vartest (Sel caldt, site, sum(sales) from fctsales f join sdates s on f.datesk = s.datesk);

失败的python代码

bbbb = 'Mon' oooo = 'Feb' query = cur.execute(open(file = 'test.sql').read().replace('bbbb',bbbb).replace('oooo',oooo)) DatabaseError: (3932, '[25000] [Teradata][ODBC Teradata Driver][Teradata Database](-3932)Only an ET or null statement is legal after a DDL Statement.')

编辑1:添加了准确的错误代码


Tags: 文件代码fromtestexecutesqlopenreplace