python 问题 - 运行 sql 来自列表的查询

python problem - running sql query from list

我正在尝试将 Excel 中的查询读取到 Python 列表中,这是我能够实现的。 下一步,我想执行 Teradata 列表中的所有查询(可以是任何数据库) 我收到一个错误,下面是示例代码。任何帮助表示赞赏。

#工作代码:#
导入 teradata 导入 xlrd udaExec = teradata.UdaExec (appName="Hello World", ersion="1.0", logConsole=False)

        session = udaExec.connect(method="odbc", system="tddev",
                username="abc", password="abc!1",authentication="LDAP",driver="Teradata");
                loc = ("C:\Users\abc\Desktop\Queries.xlsx")
                wb = xlrd.open_workbook(loc)
        wbsheet=wb.sheet_by_name("Queries")
        total_rows=wbsheet.nrows
        query_list=[]

        for row1 in range(1,total_rows):
            exceldata = wbsheet.row(row1) 
            query_list.append(exceldata)


    # getting an error after adding session execute code to above code # 

        for row2 in query_list:
                session.execute(row2)


Error:

    Traceback (most recent call last):
      File "C:/Users/prasnaya/Desktop/Terada_worksheet.py", line 31, in <module>
        session.execute(row2)
      File "C:\Users\prasnaya\AppData\Local\Programs\Python\Python37-32\lib\site-packages\teradata\udaexec.py", line 675, in execute
        self.internalCursor.execute(query, params, **kwargs)
      File "C:\Users\prasnaya\AppData\Local\Programs\Python\Python37-32\lib\site-packages\teradata\udaexec.py", line 748, in execute
        self._execute(self.cursor.execute, q, params, **kwargs)
      File "C:\Users\prasnaya\AppData\Local\Programs\Python\Python37-32\lib\site-packages\teradata\udaexec.py", line 790, in _execute
        func(query, params, **kwargs)
      File "C:\Users\prasnaya\AppData\Local\Programs\Python\Python37-32\lib\site-packages\teradata\tdodbc.py", line 613, in execute
        self.hStmt, _inputStr(_convertLineFeeds(query)), SQL_NTS)
      File "C:\Users\prasnaya\AppData\Local\Programs\Python\Python37-32\lib\site-packages\teradata\tdodbc.py", line 881, in _convertLineFeeds
        return "\r".join(util.linesplit(query))
      File "C:\Users\prasnaya\AppData\Local\Programs\Python\Python37-32\lib\site-packages\teradata\util.py", line 357, in linesplit
        sql if isString(sql) else newline.join(sql))
    TypeError: can only join an iterable


Final Working Code :


import Teradata
import xlrd

udaExec = teradata.UdaExec (appName="HelloWorld", version="1.0",
        logConsole=False)

session = udaExec.connect(method="odbc", system="tdprod",
        username="xyz", password="abc!1",authentication="LDAP",
                          driver="Teradata");



loc = ("C:\Users\prasnaya\Desktop\Queries.xlsx")


wb = xlrd.open_workbook(loc)
wbsheet=wb.sheet_by_name("Queries")
total_rows=wbsheet.nrows


print(total_rows)

query_list=[]




for row1 in range(0,total_rows):
    exceldata = wbsheet.cell_value(row1,0) 
    query_list.append(exceldata)



print(len(query_list))    
for row2 in query_list:
    print(row2)

    for row in session.execute(row2):             
        print(row)    
session.close()    

所以,问题是这里的 linesplit 方法(在 teradata 内部)假定 sql 参数是一个可迭代的:

File "C:\Users\prasnaya\AppData\Local\Programs\Python\Python37-32\lib\site-packages\teradata\util.py", line 357, in linesplit
  sql if isString(sql) else newline.join(sql))

...在您的情况下并非如此。有趣的是,Python str 对象 是可迭代的。换句话说,您从源对象(Excel sheet)获得的查询不是正确的字符串。

可能原因:

  1. 难道 rowlist,其中列表中的每个项目都是行中的一个单元格?如果是这样,请尝试 row[0],或者如果前者不起作用,则可能 str(row[0])
  2. 难道是需要类型转换成字符串?如果是这样,请尝试 str(row)(这不太可能奏效,但您可以随时尝试)
  3. 会不会是其他类型的?请尝试print(type(row));这应该会为您提供您正在处理的对象的类型 stdout,这可能有助于您更好地理解这里的问题。

祝你好运,请 post 在这里回复你的结果,这样问题可以帮助 运行 遇到类似问题的其他人。

import Teradata
import xlrd

udaExec = teradata.UdaExec (appName="HelloWorld", version="1.0",
        logConsole=False)

session = udaExec.connect(method="odbc", system="tdprod",
        username="abc", password="xyz!1",authentication="LDAP",
                          driver="Teradata");



loc = ("C:\Users\xyz\Desktop\Queries.xlsx")


wb = xlrd.open_workbook(loc)
wbsheet=wb.sheet_by_name("Queries")
total_rows=wbsheet.nrows


print(total_rows)

query_list=[]




for row1 in range(0,total_rows):
    exceldata = wbsheet.cell_value(row1,0) 
    query_list.append(exceldata)



print(len(query_list))    
for row2 in query_list:
    print(row2)

    for row in session.execute(row2):             
        print(row)    
session.close()