programing

MySQL: 쿼리에서 열 이름 또는 별칭 가져오기

goodjava 2022. 10. 23. 21:27

MySQL: 쿼리에서 열 이름 또는 별칭 가져오기

는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★SHOW COLUMNS명령어를 입력합니다.

SQL 쿼리를 지정할 수 있고 실행 시 쿼리 결과를 나타내는 행과 열이 포함된 결과 세트를 반환하는 heidisql과 유사한 응용 프로그램을 만들고 싶습니다.결과 집합의 열 이름은 SQL 쿼리에 정의된 대로 선택한 열과 일치해야 합니다.

Python 프로그램에서 ('Python'을 사용)MySQLdb내는 행 및하고 열 하지 않습니다 내 쿼리는 행 및 열 결과만 반환하고 열 이름은 반환하지 않습니다.에서는 열 이 '먹다'가 됩니다.ext,totalsize , , , , 입니다.filecountSQL은 최종적으로 프로그램에서 외부로 나오게 됩니다.

이 작업을 수행할 수 있는 유일한 방법은 SQL 파서 로직을 작성하여 선택한 열 이름을 추출하는 것입니다.

제공된 SQL의 열 이름을 쉽게 얻을 수 있는 방법이 있습니까?다음으로 쿼리는 몇 개의 열을 반환하는지 알아야 합니다.

# Python

import MySQLdb

#===================================================================
# connect to mysql
#===================================================================

try:
    db = MySQLdb.connect(host="myhost", user="myuser", passwd="mypass",db="mydb")
except MySQLdb.Error, e:
    print "Error %d: %s" % (e.args[0], e.args[1])
    sys.exit (1)

#===================================================================
# query select from table
#===================================================================

cursor = db.cursor ()   

cursor.execute ("""\
     select ext,
        sum(size) as totalsize,
        count(*) as filecount
     from fileindex
    group by ext
    order by totalsize desc;
""")

while (1):
    row = cursor.fetchone ()
    if row == None:
        break
    print "%s %s %s\n" % (row[0], row[1], row[2])

cursor.close()
db.close()      

cursor.description에는 튜플이 표시됩니다.각 튜플의 [0]은 컬럼헤더입니다.

num_fields = len(cursor.description)
field_names = [i[0] for i in cursor.description]

이것은 프리맨과 동일하지만 목록과 사전 이해력을 사용하여 더 많은 피조어적 방법을 사용한다.

columns = cursor.description 
result = [{columns[index][0]:column for index, column in enumerate(value)} for value in cursor.fetchall()]

pprint.pprint(result)

@James의 답변과 마찬가지로, 보다 피톤적인 방법은 다음과 같습니다.

fields = [field_md[0] for field_md in cursor.description]
result = [dict(zip(fields,row)) for row in cursor.fetchall()]

결과에 대한 목록 이해가 포함된 단일 열을 얻을 수 있습니다.

extensions = [row['ext'] for row in result)

또는 목록 이해에 있는 경우 추가 정보를 사용하여 결과를 필터링합니다.

large = [row for row in result if row['filesize'] > 1024 and row['filesize'] < 4096]

또는 필터링된 열에 대한 값을 누적합니다.

totalTxtSize = reduce(
        lambda x,y: x+y,
        filter(lambda x: x['ext'].lower() == 'txt', result)
)

나는 이것이 당신이 필요로 하는 것을 할 것이라고 생각한다(위의 답을 바탕으로 한다). 나는 그것을 쓰는 방법이 더 많은 것을 확신하지만, 당신은 대략적인 생각을 가져야 한다.

cursor.execute(query)
columns = cursor.description
result = []
for value in cursor.fetchall():
    tmp = {}
    for (index,column) in enumerate(value):
        tmp[columns[index][0]] = column
    result.append(tmp)
pprint.pprint(result)

,도할 수 .MySQLdb.cursors.DictCursor이렇게 하면 결과 세트가 python 사전의 python 목록으로 바뀝니다.단, 특별한 커서가 사용되기 때문에 기술적으로 허용되는 답변보다 휴대성이 떨어집니다.속도를 잘 모르겠어요.이 코드를 사용한 편집된 원본 코드입니다.

#!/usr/bin/python -u

import MySQLdb
import MySQLdb.cursors

#===================================================================
# connect to mysql
#===================================================================

try:
    db = MySQLdb.connect(host='myhost', user='myuser', passwd='mypass', db='mydb', cursorclass=MySQLdb.cursors.DictCursor)
except MySQLdb.Error, e:
    print 'Error %d: %s' % (e.args[0], e.args[1])
    sys.exit(1)

#===================================================================
# query select from table
#===================================================================

cursor = db.cursor()

sql = 'SELECT ext, SUM(size) AS totalsize, COUNT(*) AS filecount FROM fileindex GROUP BY ext ORDER BY totalsize DESC;'

cursor.execute(sql)
all_rows = cursor.fetchall()

print len(all_rows) # How many rows are returned.
for row in all_rows: # While loops always make me shudder!
    print '%s %s %s\n' % (row['ext'], row['totalsize'], row['filecount'])

cursor.close()
db.close()  

의 표준 이 적용됩니다.len(row[0])의 열 하려면 , 「 」입니다.list(row[0])) 등에 는, (열명의 일람을 참조해 주세요게이도도움!

이는 승인된 답변에 대한 추가 기능일 뿐입니다.

def get_results(db_cursor):
    desc = [d[0] for d in db_cursor.description]
    results = [dotdict(dict(zip(desc, res))) for res in db_cursor.fetchall()]
    return results

서 ''는dotdict 말합니다

class dotdict(dict):
    __getattr__ = dict.get
    __setattr__ = dict.__setitem__
    __delattr__ = dict.__delitem__

이렇게 하면 열 이름을 사용하여 훨씬 쉽게 값에 액세스할 수 있습니다.
, '우리'가 가정해 주세요.username ★★★★★★★★★★★★★★★★★」email:

cursor.execute('select * from users')
results = get_results(cursor)
for res in results:
  print(res.name, res.email)

제안 솔루션과 유사한 결과를 얻을 수 있습니다.column_header : vaule위해서db_query즉,sql.

cur = conn.cursor()
cur.execute(sql)
res = [dict((cur.description[i][0], value) for i, value in enumerate(row)) for row in cur.fetchall()]

출력 json의 예:

[
   {
      "FIRST_ROW":"Test 11",
      "SECOND_ROW":"Test 12",
      "THIRD_ROW":"Test 13"
   },
   {
      "FIRST_ROW":"Test 21",
      "SECOND_ROW":"Test 22",
      "THIRD_ROW":"Test 23"
   }
]

MySQLdb는 실제로 해당 API 호출에 대한 번역을 제공하지 않는 것 같습니다.관련된 C API 콜은 입니다.MySQLDB 변환은 없습니다.

시험:

cursor.column_names

mysql 커넥터 버전:

mysql.connector.__version__
'2.2.9'

필드 제목만 가져오려면 다음과 같이 하십시오.

table = cursor.description
check = 0
for fields in table:
    for name in fields:
        if check < 1:
            print(name),
        check +=1
    check =0

column_names = 커서.필드명

sql과 같은 컬럼을 사용하는 쉬운 방법을 찾았습니다.pymysql그리고.pandas

import pymysql
import pandas as pd

db  = pymysql.connect(host="myhost", user="myuser", passwd="mypass", db="mydb")

query  = """SELECT ext
              SUM(size) as totalsize,
              COUNT(*) as filecount
            FROM fileindex
            GROUP BY ext 
            ORDER BY totalsize DESC;
         """
df = pd.read_sql_query(query,db)

DataFrame에는 기본적으로 ext, totalsize, filecount라는 열 이름이 있습니다.추가 작업을 수행할 필요가 없습니다.

예를 들어 다음과 같습니다.

언급URL : https://stackoverflow.com/questions/5010042/mysql-get-column-name-or-alias-from-query