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)获得的查询不是正确的字符串。
可能原因:
- 难道
row
是 list
,其中列表中的每个项目都是行中的一个单元格?如果是这样,请尝试 row[0]
,或者如果前者不起作用,则可能 str(row[0])
。
- 难道是需要类型转换成字符串?如果是这样,请尝试
str(row)
(这不太可能奏效,但您可以随时尝试)
- 会不会是其他类型的?请尝试
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()
我正在尝试将 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)获得的查询不是正确的字符串。
可能原因:
- 难道
row
是list
,其中列表中的每个项目都是行中的一个单元格?如果是这样,请尝试row[0]
,或者如果前者不起作用,则可能str(row[0])
。 - 难道是需要类型转换成字符串?如果是这样,请尝试
str(row)
(这不太可能奏效,但您可以随时尝试) - 会不会是其他类型的?请尝试
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()