cx_Oracle을 사용하여 사전 목록 만들기
Oracle에서 데이터를 가져올 수 있는 "더 읽기 쉬운" 형식을 만들기 위해 다음 기능을 사용하고 있습니다.기능은 다음과 같습니다.
def rows_to_dict_list(cursor):
"""
Create a list, each item contains a dictionary outlined like so:
{ "col1_name" : col1_data }
Each item in the list is technically one row of data with named columns,
represented as a dictionary object
For example:
list = [
{"col1":1234567, "col2":1234, "col3":123456, "col4":BLAH},
{"col1":7654321, "col2":1234, "col3":123456, "col4":BLAH}
]
"""
# Get all the column names of the query.
# Each column name corresponds to the row index
#
# cursor.description returns a list of tuples,
# with the 0th item in the tuple being the actual column name.
# everything after i[0] is just misc Oracle info (e.g. datatype, size)
columns = [i[0] for i in cursor.description]
new_list = []
for row in cursor:
row_dict = dict()
for col in columns:
# Create a new dictionary with field names as the key,
# row data as the value.
#
# Then add this dictionary to the new_list
row_dict[col] = row[columns.index(col)]
new_list.append(row_dict)
return new_list
그런 다음 다음 다음과 같은 기능을 사용합니다.
sql = "Some kind of SQL statement"
curs.execute(sql)
data = rows_to_dict_list(curs)
#
for row in data:
item1 = row["col1"]
item2 = row["col2"]
# Do stuff with item1, item2, etc...
# You don't necessarily have to assign them to variables,
# but you get the idea.
이것이 다양한 수준의 스트레스에서 꽤 잘 수행되는 것처럼 보이지만, 저는 이것을 하는 더 효율적이거나 "피토닉적인" 방법이 있는지 궁금합니다.
개선해야 할 다른 사항들이 있지만, 이것은 저에게 정말 큰 충격을 주었습니다.
for col in columns:
# Create a new dictionary with field names as the key,
# row data as the value.
#
# Then add this dictionary to the new_list
row_dict[col] = row[columns.index(col)]
비효율적일 뿐만 아니라, 사용하기index
적어도 같은 항목이 목록에서 두 번 발생할 수 있는 상황에서는 버그가 발생하기 쉽습니다.사용하다enumerate
대신:
for i, col in enumerate(columns):
# Create a new dictionary with field names as the key,
# row data as the value.
#
# Then add this dictionary to the new_list
row_dict[col] = row[i]
하지만 그건 정말 작은 감자입니다.이 기능의 훨씬 더 콤팩트한 버전은 다음과 같습니다.
def rows_to_dict_list(cursor):
columns = [i[0] for i in cursor.description]
return [dict(zip(columns, row)) for row in cursor]
그게 효과가 있는지 알려주세요.
목록에 있는 모든 항목을 미리 덤프하는 메모리 사용을 방지하기 위해 생성기 기능으로 커서를 감쌀 수 있습니다.
def rows_as_dicts(cursor):
""" returns cx_Oracle rows as dicts """
colnames = [i[0] for i in cursor.description]
for row in cursor:
yield dict(zip(colnames, row))
그런 다음 다음과 같이 사용합니다. 반복하는 동안 커서의 행이 딕트로 변환됩니다.
for row in rows_as_dicts(cursor):
item1 = row["col1"]
item2 = row["col2"]
메모리 사용량이 많기 때문에 큰 결과 집합에 딕트를 사용하면 안 됩니다.저는 cx_Oracle을 많이 사용하고 있고, 그것을 위한 모듈을 작성할 만큼 좋은 사전 커서가 없어서 신경이 쓰였습니다.또한 저는 파이썬을 여러 데이터베이스에 연결해야 하므로 어떤 DB API 2 커넥터와도 사용할 수 있는 방식으로 연결했습니다.
PyPi DBMS에 대한 정보입니다. 데이터 기반이 더 간편해졌습니다.
>>> import dbms
>>> db = dbms.OraConnect('myUser', 'myPass', 'myInstance')
>>> cur = db.cursor()
>>> cur.execute('SELECT * FROM people WHERE id = :id', {'id': 1123})
>>> row = cur.fetchone()
>>> row['last_name']
Bailey
>>> row.last_name
Bailey
>>> row[3]
Bailey
>>> row[0:4]
[1123, 'Scott', 'R', 'Bailey']
커서 "Cursor"가 이미 정의되어 있고 이동할 준비가 되어 있다고 가정합니다.
byCol = {cl:i for i,(cl,type, a, b, c,d,e) in enumerate(Cursor.description)}
그럼 그냥 가셔도 됩니다.
for row in Cursor: column_of_interest = row[byCol["COLUMN_NAME_OF_INTEREST"]]
시스템이 스스로 처리하는 것처럼 깨끗하고 매끄럽지는 않지만 끔찍하지는 않습니다.
딕트 만들기
cols=dict()
for col, desc in enumerate(cur.description):
cols[desc[0]] = col
액세스하기:
for result in cur
print (result[cols['COL_NAME']])
더 좋은 것이 있습니다.
import cx_Oracle
def makedict(cursor):
"""Convert cx_oracle query result to be a dictionary
"""
cols = [d[0] for d in cursor.description]
def createrow(*args):
return dict(zip(cols, args))
return createrow
db = cx_Oracle.connect('user', 'pw', 'host')
cursor = db.cursor()
rs = cursor.execute('SELECT * FROM Tablename')
cursor.rowfactory = makedict(cursor)
언급URL : https://stackoverflow.com/questions/10455863/making-a-dictionary-list-with-cx-oracle
'programing' 카테고리의 다른 글
한 커밋이 다른 커밋의 하위인지 확인하려면 어떻게 해야 합니까? (0) | 2023.07.19 |
---|---|
팬더 그림에서 x축 눈금 레이블을 회전하는 방법 (0) | 2023.07.19 |
멀티프로세싱에서의 공유 메모리 객체 (0) | 2023.07.19 |
조건부('if') 문을 기준으로 데이터 프레임의 값 바꾸기 (0) | 2023.07.19 |
Python으로 Excel(xls) 파일 읽기/파싱 (0) | 2023.07.19 |