2017-11-23 2 views
3

내가 진행 openedge 데이터베이스에서 테이블에서 첫 번째 행을 인쇄하려고 파이썬과 pyodbc참조하는 행 값 열 이름은 대시 (하이픈)를 포함

새로운 오전.

cursor.execute("select my-nr, my-dt-my from mytable") 
row = cursor.fetchone() 
print(row.my-nr, row.my-dt-my) 

이 오류를 정의되지 않은 이름을 제공합니다 : 'NR' 정의되지 않은 이름 'DT' 정의되지 않은 이름 '내'

나는 그것을 가지고 추측 (윈도우 7) 여기에서 실행되지 않는 코드 블록이다 마이너스와 관련이있는 것 - 점 뒤에있는 기호. (row.my-nr, row.my-dt-my)

이전에 데이터베이스에서 테이블 이름과 열 이름을 쉽게 인쇄 할 수 있었지만 어떤 이유로 인쇄가 더 어려웠습니다.

아이디어를 얻으려면 어떻게해야합니까?

+0

나는 하나 이상의 행을 원하면 fetchall()을 사용해야한다고 생각한다. –

답변

0

데이터베이스의 변수 이름을 변경해야한다고 생각하고 '-'문자가 없는지 확인하십시오. 변수는 python에 의해 예약 된 문자를 포함 할 수 없습니다. 예를 들어 하이픈 (-), 느낌표 (!), 콜론 (:) 등은 사용하지 않아야합니다.

this answer에 따르면 변수 이름에 허용 된 유일한 문자는 밑줄 (_)처럼 보입니다.

1

pyodbc를 사용하면 pyodbc.Row 객체의 값을 row.column_name 형식으로 참조 할 수 있습니다. 단, 열 이름은 올바른 Python 식별자 여야합니다. 따라서, 예를 들어, 우리는 "도시"열의 값을 인쇄 할

row = crsr.fetchone() 
print(row.city) 

처럼 뭔가를 할 수 있습니다. 불행하게도, 우리가 사용하는 "내-NR"열의 값을 인쇄하려고 그래서 만약 my-nr 법적 파이썬 식별자는 ...

row = crsr.fetchone() 
print(row.my-nr) # error 

없는 파이썬은 그 "row.my 마이너스 nr"같은 곳 row.my을 구문 분석 Row 객체의 열로 해석되고 nr은 Python 변수로 해석됩니다.

, 우리는 열 이름의 목록을 잡을 수있는 문제를 해결하려면 사전에 행 값으로 그 이름을 병합 한 후 사전에있는 값을 참조하십시오 :

crsr.execute(sql) 
col_names = [x[0] for x in crsr.description] 

row = crsr.fetchone() 
row_as_dict = dict(zip(col_names, row)) 
print(row_as_dict['my-nr']) # no error 
2

가장 간단 내가 생각할 수있는 해결책은 이것이다. 첫째, 하이픈을 포함하는 열은 OpenEdge (see here)에서 인용해야합니다. 둘째, 유효한 Python 속성으로 참조 될 수 있도록 별칭을 지정할 수 있습니다. 다음과 같이해야합니다.

cursor.execute('select "my-nr" as mynr, "my-dt-my" as mydtmy from mytable') 
row = cursor.fetchone() 
print(row.mynr, row.mydtmy) 

행운을 빈다.