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__
이렇게 하면 열 이름을 사용하여 훨씬 쉽게 값에 액세스할 수 있습니다.
, '우리'가 가정해 주세요.user이 name ★★★★★★★★★★★★★★★★★」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
'programing' 카테고리의 다른 글
| Java에서 명명된 매개 변수 관용어 (0) | 2022.10.23 |
|---|---|
| 클래스가 정의된 PHP 파일(실행 시) 찾기 (0) | 2022.10.23 |
| Python에서 트리를 구현하려면 어떻게 해야 하나요? (0) | 2022.10.23 |
| PHP MYSQL UPDATE(존재하는 경우) 또는 INSERT(존재하지 않는 경우)? (0) | 2022.10.23 |
| MAX(Column value), MYSQL에서 다른 열로 파티션을 선택한 행은 어떻게 해야 합니다. (0) | 2022.10.23 |