热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python导出postgresql的数据字典为excel

importpsycopg2importxlwtfromdatetimeimportdatetimeimportosdefgetData():connpsycopg2.connec
import psycopg2
import xlwt
from datetime import datetime
import os


def getData():
    cOnn= psycopg2.connect(database='数据库名', user='postgres', password='密码', host='127.0.0.1', port=5432)
    cur = conn.cursor()
    query = '''
        SELECT
	d.relname AS relname,
	obj_description ( relfilenode, 'pg_class' ) AS tablename,
	attname AS field,
CASE
	typname 
	WHEN '_bpchar' THEN
	'char' 
	WHEN '_varchar' THEN
	'varchar' 
	WHEN '_date' THEN
	'date' 
	WHEN '_float8' THEN
	'float8' 
	WHEN '_int4' THEN
	'int4' 
	WHEN '_int8' THEN
	'int8' 
	WHEN '_interval' THEN
	'interval' 
	WHEN '_numeric' THEN
	'numeric' 
	WHEN '_float4' THEN
	'float4' 
	WHEN '_int2' THEN
	'smallint' 
	WHEN '_text' THEN
	'text' 
	WHEN '_time' THEN
	'time' 
	WHEN '_timestamp' THEN
	'timestamp' 
	WHEN '_timestamptz' THEN
	'timestamptz' 
	END AS TYPE,
	CASE
		typname 
		WHEN '_bpchar' THEN
		atttypmod - 4 
		WHEN '_varchar' THEN
		atttypmod - 4 
		WHEN '_numeric' THEN
		( atttypmod - 4 ) / 65536 ELSE attlen 
	END AS LENGTH,
	CASE
		typname 
		WHEN '_numeric' THEN
		( atttypmod - 4 ) % 65536 ELSE 0 
	END AS xs,
CASE
	WHEN b.attnotnull = 't' THEN
	'不能为空' ELSE'' 
	END AS NOTNULL,
CASE

	WHEN ( SELECT COUNT ( * ) FROM pg_constraint WHERE cOnrelid= b.attrelid AND conkey [ 1 ]= attnum AND cOntype= 'p' ) > 0 THEN
	'主键' ELSE'' 
	END AS zj ,
col_description ( b.attrelid, b.attnum ) AS COMMENT
FROM
	pg_stat_user_tables AS A,
	pg_class AS d,
	pg_tables AS P,
	pg_attribute AS b,
	pg_type AS C 
WHERE
	A.relid = b.attrelid 
	AND b.attnum > 0 
	AND b.atttypid = C.typelem 
	AND substr( typname, 1, 1 ) = '_' 
	AND P.tablename = d.relname 
	AND d.relname = A.relname 
	AND A.relname NOT LIKE'c%' 
	AND A.relname NOT LIKE'S%' 
ORDER BY
	A.schemaname,
	A.relname,
attnum
     '''
    cur.execute(query)
    data = cur.fetchall()
    conn.commit()
    cur.close()
    conn.close()
    return data


def queryDataToExcel(name):
    data = getData()
    myExcel = xlwt.Workbook('encoding=utf-8')
    # 查询二原数据采集量
    sheet1 = myExcel.add_sheet(name, cell_overwrite_ok=True)
    sheet1.col(0).width = 150 * 20
    sheet1.col(1).width = 150 * 20
    sheet1.col(2).width = 150 * 20
    sheet1.col(3).width = 150 * 20
    sheet1.col(4).width = 150 * 20
    sheet1.col(5).width = 150 * 20
    sheet1.col(6).width = 150 * 20
    sheet1.col(7).width = 150 * 20
    sheet1.col(8).width = 150 * 20
    sheet1.col(8).width = 350 * 20

    #设置居中
    a1 = xlwt.Alignment()
    a1.horz = 0x02
    a1.vert = 0x01
    style = xlwt.XFStyle()  # 赋值style为XFStyle为初始化样式
    style.alignment = a1

    today = datetime.today()  # 获取当前日期,得到一个datetime对象如:(2019, 7, 2, 23, 12, 23, 424000)
    today_date = datetime.date(today)  # 将获取到的datetime对象仅取日期如:2019-7-2
    items = ['数据表', '表名', '字段', '类型', '长度', '小数点', '是否为空', '是否为主键', '注释']
    for col in range(len(items)):
        sheet1.write(0, col, items[col])
    # 从data获取第一列数据,[("xxx","xxx"),()]
    first_col = []
    for i in range(len(data)):
        first_col.append(data[i][0])
    print("first_col:", first_col)
    # 去掉重复的列数据,并顺序不变
    nFirst_col = list(set(first_col))
    nFirst_col.sort(key=first_col.index)
    print("nFirst_col:", nFirst_col)
    row = 1
    for i in nFirst_col:
        count = first_col.count(i)  # 计算重复的元素个数
        mergeRow = row + count - 1  # 合并后的上行数,
        sheet1.write_merge(row, mergeRow, 0, 0, i, style)  # 第一列
        sheet1.write_merge(row, mergeRow, 1, 1, i, style)
        row = mergeRow + 1  # 从下一行开始写入

    # 获取data[i]中的第二个元素,循环写入
    for row in range(len(data)):
        for col in range(1, len(data[row])):
            sheet1.write(row + 1, col, data[row][col], style)
    fileName = name + '_' + str(today_date) + '.xls'
    rootPath = os.path.dirname(os.path.abspath(_file_))+'\\'
    print(rootPath)
    flag = os.path.exists(rootPath+fileName)
    if flag:
        os.remove(rootPath+fileName)
        myExcel.save(fileName)
    else:
        myExcel.save(fileName)  # 以传递的name+当前日期作为excel名称保存


if __name__ == '__main__':
    print("这是从postgresql中导出excel的demo----")
    queryDataToExcel("数据表")

  2.样式:

Python导出postgresql的数据字典为excel

这里我用的是xlwt,没用openpyxl操作


推荐阅读
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
author-avatar
用户d4k2wd8en1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有