蟒蛇:MYSQLdb。如何在不执行 select * 在大表中获取列名?
Posted
技术标签:
【中文标题】蟒蛇:MYSQLdb。如何在不执行 select * 在大表中获取列名?【英文标题】:python: MYSQLdb. how to get columns name without executing select * in a big table? 【发布时间】:2014-07-10 07:14:05 【问题描述】:我想获取一个表的列名,但其中有超过一百万的数据。 所以我不能使用:
cursor.execute("SELECT * FROM table_name")
print cursor.description
在 sqlite3 中,我是这样做的
crs.execute("PRAGMA table_info(%s)" %(tablename[0]))
for info in crs:
print info
但这在 python mysqldb 中不起作用。有人知道怎么做吗?
【问题讨论】:
show columns from <table name>
;
那你值得一票。
【参考方案1】:
你可以使用SHOW columns
:
cursor.execute("SHOW columns FROM table_name")
print [column[0] for column in cursor.fetchall()]
仅供参考,这与使用desc
基本相同:
cursor.execute("desc table_name")
print [column[0] for column in cursor.fetchall()]
【讨论】:
它是column[0]
,而不是columns[0]
。我无法编辑代码,因为编辑少于 6 个字符。【参考方案2】:
执行此操作的正确方法是使用"SHOW columns FROM table_name"
,但是,您也可以简单地将LIMIT
添加到现有查询中:
cursor.execute("SELECT * FROM table_name LIMIT 0")
print cursor.description
【讨论】:
与“SHOW COLUMNS”或“DESCRIBE”或“SHOW CREATE TABLE”相比,它的好处是您还可以将它用于假表,例如“SHOW PROCESSLIST”的结果【参考方案3】:试试
cursor.execute("SELECT * FROM table_name LIMIT 1")
或
cursor.execute("SELECT * FROM table_name WHERE 1=0")
两者都可以防止大量数据受到干扰。第二个可能更优雅。 我刚刚检查过,即使这样也有效:
>>>cursor.execute("SELECT LEFT(long_text,5) as short_text FROM table_name WHERE 1=0")
>>>print cursor.description
(('short_text', 253, 0, 5, 5, 31, 0),)
【讨论】:
LIMIT = 1 将返回单行。如果要返回列标题并随后显示几行数据,可以遍历 cursor.description,它是一个元组的元组,如: print("\t".join([column[0] for cursor.description 中的列]))【参考方案4】:cursor.execute("SELECT * FROM table_name LIMIT 0")
cursor.column_names
使用以下内容查找其他信息
[v for v in dir(cursor) if v.find("_")]
【讨论】:
【参考方案5】:data = pd.read_sql("""SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='TABLE_NAME'""", conn)
print(data.COLUMN_NAME)
创建连接后,使用信息模式,我们调用提取列名而不提取任何观察结果。
【讨论】:
社区鼓励在代码中添加解释,而不是纯粹基于代码的答案(参见here)。以上是关于蟒蛇:MYSQLdb。如何在不执行 select * 在大表中获取列名?的主要内容,如果未能解决你的问题,请参考以下文章
使用 MySQLdb 执行“SELECT ... WHERE ... IN ...”
如何从字典中选择多行(executemany select)