【问题标题】:python: MYSQLdb. how to get columns name without executing select * in a big table?蟒蛇:MYSQLdb。如何在不执行 select * 在大表中获取列名?
【发布时间】: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>;
  • 那你值得一票。

标签: python mysql mysql-python


【解决方案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)。
    猜你喜欢
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多