centos下python安装pgadmin_file "/root/miniconda3/lib/python3.8/zipfile.py", -程序员宅基地

技术标签: python  

postgresql号称世界上最先进的开源关系数据库,不过公司内部使用postgresql不多,其实自己也用得不多。之所以要用pg,因为公司的数仓支持扩展pg(目前还有比较多问题),可以充分利用公司数仓的权限管理和大数据分析能力,再结合pg关系型数据库的能力。

但是不像mysql,除了psql这种原生自带的命令行客户端工具,没有公司自研的pg客户端,或者能支持兼容pg的客户端。

pgAdmin是一款专门针对PostgreSQL数据库的开源客户端管理软件,支持 Linux、Unix、Mac OS X 以及 Windows 操作系统,可以管理 PostgreSQL 9.2 以及更高版本。目前比较新的pgAdmin4,提供了大量的功能特性,由旧的CS架构变更为基于浏览器的BS架构。

1. 版本问题

先是找了篇参考文章:https://blog.csdn.net/java1993666/article/details/85635789,但这个下载的包是:pgadmin4-3.6-py2.py3-none-any.whl,比较老的版本,启动pgadmin的时候报错 

#python pgAdmin4.py 
Traceback (most recent call last):
  File "pgAdmin4.py", line 34, in <module>
    import config
  File "/root/miniconda3/lib/python3.8/site-packages/pgadmin4/config.py", line 29, in <module>
    from pgadmin.utils import env, IS_PY2, IS_WIN, fs_short_path
  File "/root/miniconda3/lib/python3.8/site-packages/pgadmin4/pgadmin/__init__.py", line 23, in <module>
    from flask_security import Security, SQLAlchemyUserDatastore, current_user
  File "/root/miniconda3/lib/python3.8/site-packages/flask_security/__init__.py", line 13, in <module>
    from .core import Security, RoleMixin, UserMixin, AnonymousUser, current_user
  File "/root/miniconda3/lib/python3.8/site-packages/flask_security/core.py", line 28, in <module>
    from .forms import ChangePasswordForm, ConfirmRegisterForm, \
  File "/root/miniconda3/lib/python3.8/site-packages/flask_security/forms.py", line 17, in <module>
    from flask_wtf import FlaskForm as BaseForm
  File "/root/miniconda3/lib/python3.8/site-packages/flask_wtf/__init__.py", line 17, in <module>
    from .recaptcha import *
  File "/root/miniconda3/lib/python3.8/site-packages/flask_wtf/recaptcha/__init__.py", line 2, in <module>
    from .fields import *
  File "/root/miniconda3/lib/python3.8/site-packages/flask_wtf/recaptcha/fields.py", line 3, in <module>
    from . import widgets
  File "/root/miniconda3/lib/python3.8/site-packages/flask_wtf/recaptcha/widgets.py", line 5, in <module>
    from werkzeug import url_encode
ImportError: cannot import name 'url_encode' from 'werkzeug' (/root/miniconda3/lib/python3.8/site-packages/werkzeug/__init__.py)

原来新版本werkzeug不支持url_encode,解决办法是回退到0.16.1版本。

pip uninstall Werkzeug

pip install Werkzeug==0.16.1 --timeout=60

 但发现还有其他库版本问题,机器上安装的是python3.8,应该是pgadmin4-3.6版本并不适合用python3.8,只能适配3.8之前的python版本。

最终还是参考官方文档,看最新的版本pgadmin4-4.29-py3-none-any.whl,支持python3.8,安装后可以正常起来。

官网下载安装地址:https://www.pgadmin.org/download/pgadmin-4-python/

2. 配置文件

配置有点多,有几个配置下需注意下

# This option allows the user to host the application on a LAN
# Default hosting is on localhost (DEFAULT_SERVER='localhost').
# To host pgAdmin4 over LAN set DEFAULT_SERVER='0.0.0.0' (or a specific
# adaptor address.
#
# NOTE: This is NOT recommended for production use, only for debugging
# or testing. Production installations should be run as a WSGI application
# behind Apache HTTPD.
DEFAULT_SERVER = '0.0.0.0'

# The default port on which the app server will listen if not set in the
# environment by the runtime
DEFAULT_SERVER_PORT = 80

# Check for new versions of the application?
UPGRADE_CHECK_ENABLED = False

3. 启动日志

初次启动,需要配置邮箱账户和密码,正常启动后如下

#python pgAdmin4.py 
Starting pgAdmin 4. Please navigate to http://0.0.0.0:80 in your browser.
 * Serving Flask app "pgadmin" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off

服务日志默认放在:/var/log/pgadmin。

运行一段时间后,可能报CSRF session异常

Starting pgAdmin 4. Please navigate to http://0.0.0.0:80 in your browser.
 * Serving Flask app "pgadmin" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
2021-01-07 16:28:27,550: ERROR  flask.app:      400 Bad Request: The CSRF session token is missing.
Traceback (most recent call last):
  File "/root/miniconda3/lib/python3.8/site-packages/flask_wtf/csrf.py", line 256, in protect
    validate_csrf(self._get_csrf_token())
  File "/root/miniconda3/lib/python3.8/site-packages/flask_wtf/csrf.py", line 94, in validate_csrf
    raise ValidationError('The CSRF session token is missing.')
wtforms.validators.ValidationError: The CSRF session token is missing.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/root/miniconda3/lib/python3.8/site-packages/flask/app.py", line 1811, in full_dispatch_request
    rv = self.preprocess_request()
  File "/root/miniconda3/lib/python3.8/site-packages/flask/app.py", line 2087, in preprocess_request
    rv = func()
  File "/root/miniconda3/lib/python3.8/site-packages/flask_wtf/csrf.py", line 224, in csrf_protect
    self.protect()
  File "/root/miniconda3/lib/python3.8/site-packages/flask_wtf/csrf.py", line 259, in protect
    self._error_response(e.args[0])
  File "/root/miniconda3/lib/python3.8/site-packages/flask_wtf/csrf.py", line 302, in _error_response
    raise CSRFError(reason)
flask_wtf.csrf.CSRFError: 400 Bad Request: The CSRF session token is missing.
2021-01-07 16:28:29,057: ERROR  flask.app:      400 Bad Request: The CSRF session token is missing.

抓包看是正常的,有同事用浏览器登陆使用一段时间后,一直没操作,但前端一直有请求http请求过来,CSRF session token可能已经失效了,所以服务日志报上面错误。将CSRF干掉会影响服务正常使用,忽略上面错误日志即可。

想加pgAdmin4进程监控,结果一不小心同时执行了上百个启动命令,等把所有启动干掉,再次手动执行的时候,报下面异常

#python pgAdmin4.py Traceback (most recent call last):
  File "pgAdmin4.py", line 35, in <module>
    import config
  File "/root/miniconda3/lib/python3.8/site-packages/pgadmin4/config.py", line 25, in <module>
    from pgadmin.utils import env, IS_WIN, fs_short_path
  File "/root/miniconda3/lib/python3.8/site-packages/pgadmin4/pgadmin/__init__.py", line 26, in <module>
    from flask_mail import Mail
  File "/root/miniconda3/lib/python3.8/site-packages/flask_mail.py", line 18, in <module>
    import smtplib
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 779, in exec_module
  File "<frozen importlib._bootstrap_external>", line 911, in get_code
  File "<frozen importlib._bootstrap_external>", line 580, in _compile_bytecode
EOFError: marshal data too short
(base) [root@docker-201027162308859662 ~/miniconda3/lib/python3.8/site-packages/pgadmin4]#sleep 10 second the time, the JMS thread is still alive

解决方法:要到指定目录执行删除操作

~/miniconda3/lib/python3.8
find -name __pycache__  | xargs rm -rf 

4. 页面异常

登陆pgadmin,一直会有个空白弹框,无法关掉,没有截图下来,最后用下面的方法尝试解决了。一般不会遇到这种问题,如果遇到了,可以参考此方法。

5. 其他

pgAdmin4的源码:https://github.com/postgres/pgadmin4

也可以docker下安装运行pgadmin,参考:https://www.yht7.com/news/96535

目前刚刚使用一段时间,感觉还不错,还需要观察一段时间。另外听说adminer也不错,有时间再拿两者对比看看,adminer可以docker下安装运行:

adminer:
    image: adminer
    hostname: adminer
    restart: always
    ports:
      - 8080:8080

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/L13763338360/article/details/112291804

智能推荐

centos7环境下使用python脚本监控mongodb集群复制状态-程序员宅基地

centos7环境下使用python脚本监控mongodb集群复制状态centos环境下搭建了 MongoDB 副本集,需要对集群的复制状态进行监控获取集群的状态信息,集群是3个节点,没有设置仲裁者[root@eus-image-design-mongo01:/usr/local]# mongo --port 21000MongoDB shell version v3.4.24c..._环境:python2.7+centos7+mongodb3.4/3.6/4.0 副本集

消息队列及常见消息队列介绍_消息队列有哪些_coder i++的博客-程序员宅基地

转载 消息队列及常见消息队列介绍 一、消息队列(MQ)概述消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为:当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。消息队列主要解决了应用耦合、异步处理、流量削锋等问题。当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分数据库如Redis、Mysql以及phxsql也可实现消息队列_消息队列有哪些

sql 查询重复记录并删除-程序员宅基地

--查询重复记录select original_product_name,original_product_specfrom ent_sfl_product_mappingwhere deleted = 0group by original_product_name,original_product_spec having count(1) > 1--删除重复记录d...

简述spring中常有的几种advice?-程序员宅基地

在Spring中,Advice都是通过Interceptor来实现的,主要有以下几种:1. 环绕Advice://例子摘自Spring referencepublic interface MethodInterceptor extends Interceptor { Object invoke(MethodInvocation invocation) throws T..._下列哪项不属于spring的advice类型

我叫LD,我是PM,我在路上-程序员宅基地

今天看到一片文章《我是艺术家》,颇有感受,忍不住想给自己也做个自我表述,当时涌上心头的词就是:我叫LD,我是PM,我在路上,那就用它来做我这篇自述的标题吧。 我81年出生在湖南的一个普通小镇,童年的岁月在父亲工作的大院的里度过,87年在母亲工作的中心小学读书,92年因为父亲的单位迁移到HY市而转学到子弟小学读书,93年上市重点初中,96年上省重点高中。在我18岁前的生命中,除了学习成绩不

go语言学习笔记2------第一个Go语言程序-程序员宅基地

第一个GO程序开发第一个GO程序。具体步骤如下:1:选择文件—&amp;gt;新建 弹出如下对话框。 注意:程序名称,和程序保存位置不能输入中文2:新建完成后,开始输入代码。第一行:每个Go源代码文件的开头都是一个package声明,表示该Go代码所属的包。 Go语言中是通过包来对代码进行管理的。那么什么是包呢?我通过一个例子来解释一下包的概念。例如:有一家公司叫“京东“”,该...

随便推点

vue实现tab切换并带切换样式的效果_vue tabs 默认tab就先刷新其他tab样式_小阳生煎的博客-程序员宅基地

如图所示<template> <div class="home" @touchmove.prevent @mousewheel.prevent> <div class="header"> <div class="header-one"> <div></div> </div> <div class="header-two"> <_vue tabs 默认tab就先刷新其他tab样式

flume报java.io.IOException: Not a data file的ERROR-程序员宅基地

flume清洗时报错 java.io.IOException: Not a data file,错误如下图:opening file 的文件明明是一个数据文件,非要说不是数据文件。没办法,追踪错误,查找源码去。。。结果在 package org.apache.avro.file中的 DataFileStream 类的initialize(InputStreamin)

android获取阅读进度,Android 进度条-程序员宅基地

ProgressBar是一个进度条控件,一般在需要做某个比较耗时的操作的时候,向用户展示执行进度,以免用户以为已经失去响应。常用属性:style  设置进度条的样式visible 是否显示进度条1、圆形进度条一个圆形进度条,不断旋转。1常用样式:Widget.ProgressBar.Small/Large/Inverse。没有Medium,效果上来看,Inverse相当于Medium。也..._android 获取progressminmax

I3D模型_2017_CVPR-程序员宅基地

作者的观点:若在足够大的视频动作识别数据集上训练(Kinetics),是否能提升模型在其他数据集(HMDB-51,UCF-101)上的表现呢?论文核心内容:对于不同模型,这种方法(见观点)提升性能程度相差很大,于是提出 Two-Stream Inflated 3D ConvNet ( I3D ) 模型 实验分析,现有最好的动作识别方法在数据集Kinetics上的表现,其次是在对..._i3d模型

HackTheBox - ScriptKiddie(CVE-2020-7384)_z4yn:)的博客-程序员宅基地

ScriptKiddie#0 信息收集Namp 扫描端口,根据端口开放情况切入点应该在5000端口上。─[sg-vip-1]─[10.10.14.19]─[htb-z4yn@htb-2t3aamavbq]─[~]└──╼ [★]$ nmap 10.10.10.226 -p-Starting Nmap 7.80 ( https://nmap.org ) at 2021-04-20 02:13 UTCNmap scan report for 10.10.10.226Host is up.._cve-2020-7384

计算机组成原理——计算机运算部分_、y从-程序员宅基地

存储容量与地址总线之间的关系1kb=210b 需要10根地址总线1Mb=210kb = 210*210b =220b需要20根地址总线1GB=210Mb=210*210*210b=230b 需要30根地址总线2GB=2 *230b=231b需要31根地址总线计算机系统性能评价1.非时间指标:机器字长:指机器一次能处理的二进制位数。总线宽度:数据总线一次能并行传送的最大信息位数。(..._、y从