Downgrade psycopg2 to 2.7.7 (or whatever came before 2.8). Apparently they broke backwards compatibility:-(
-- Dave Page Blog: http://pgsnake.blogspot.com Twitter: @pgsnake EnterpriseDB UK:http://www.enterprisedb.com The Enterprise PostgreSQL Company > On 4 Apr 2019, at 17:33, Shaheed Haque <shaheedha...@gmail.com> wrote: > > I can login, but when I click on "Servers", nothing happens on screen > and the error log gets this: > > [2019-04-04 16:10:10 +0000] [5850] [INFO] Starting gunicorn 19.9.0 > [2019-04-04 16:10:10 +0000] [5850] [INFO] Listening at: > unix:/home/ubuntu/pgadmin.sock (5850) > [2019-04-04 16:10:10 +0000] [5850] [INFO] Using worker: gthread > [2019-04-04 16:10:10 +0000] [5853] [INFO] Booting worker with pid: 5853 > 2019-04-04 16:10:25,732: ERROR flask.app: > 'psycopg2.extensions.Column' object has no attribute '_asdict' > Traceback (most recent call last): > File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line > 1813, in full_dispatch_request > rv = self.dispatch_request() > File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line > 1799, in dispatch_request > return self.view_functions[rule.endpoint](**req.view_args) > File "/usr/local/lib/python3.6/dist-packages/flask/views.py", line 88, in > view > return self.dispatch_request(*args, **kwargs) > File > "/usr/local/lib/python3.6/dist-packages/pgadmin4/pgadmin/browser/utils.py", > line 259, in dispatch_request > return method(*args, **kwargs) > File > "/usr/local/lib/python3.6/dist-packages/pgadmin4/pgadmin/browser/utils.py", > line 309, in children > children.extend(module.get_nodes(*args, **kwargs)) > File > "/usr/local/lib/python3.6/dist-packages/pgadmin4/pgadmin/browser/server_groups/servers/__init__.py", > line 127, in get_nodes > in_recovery, wal_paused = recovery_state(conn, manager.version) > File > "/usr/local/lib/python3.6/dist-packages/pgadmin4/pgadmin/browser/server_groups/servers/__init__.py", > line 52, in recovery_state > status, result = connection.execute_dict(recovery_check_sql) > File > "/usr/local/lib/python3.6/dist-packages/pgadmin4/pgadmin/utils/driver/psycopg2/connection.py", > line 1202, in execute_dict > desc.to_dict() for desc in cur.ordered_description() > File > "/usr/local/lib/python3.6/dist-packages/pgadmin4/pgadmin/utils/driver/psycopg2/connection.py", > line 1202, in <listcomp> > desc.to_dict() for desc in cur.ordered_description() > File > "/usr/local/lib/python3.6/dist-packages/pgadmin4/pgadmin/utils/driver/psycopg2/cursor.py", > line 94, in to_dict > ores = OrderedDict(self.orig_col._asdict()) > AttributeError: 'psycopg2.extensions.Column' object has no attribute '_asdict' > > It seems as though the version of psycopg2 is not what is expected, > rather than anything to do with "builtins.SERVER_MODE = True"? By way > of full disclosure, I do in fact have both psycopg2 AND > psycopg2-binary installed [1] but some quick experiments removing one > or other did not solve the problem. > > Have I overlooked something? > > Thanks, Shaheed > > [1] this came up in another discussion recently, and it seems that I > ought to remove the psycopg2-binary though 4.2 was OK with this setup. > >> On Thu, 4 Apr 2019 at 15:04, Dave Page <dp...@pgadmin.org> wrote: >> >> Hi >> >> It worked fine when I tested it. If you don't get any errors and you get a >> login prompt, it should all be good. >> >>> On Thu, Apr 4, 2019 at 3:01 PM Shaheed Haque <shaheedha...@gmail.com> wrote: >>> >>> Hi Dave, >>> >>> I'm just migrating to the fixes in 4.4. Can I just double check one >>> thing? In my original hack, I needed to create a link "wsgi.py" -> >>> "pgAdmin4.py", so the the corresponding gunicorn command is something >>> like this: >>> >>> gunicorn ... --bind unix:/.../pgadmin.sock wsgi:application >>> >>> Now, in the documentation updates as part of this fix, the last >>> argument to that line reads "pgAdmin4:app" and not "wsgi:application". >>> The reason I though I needed to use the wsgi.py file is that it >>> contains these lines amongst other: >>> >>> # Ensure the global server mode is set. >>> builtins.SERVER_MODE = True >>> >>> I'm not sure if, by following the updated docs, I am missing a >>> necessary setting? >>> >>> Thanks, Shaheed >>> >>>> On Tue, 5 Mar 2019 at 09:11, Dave Page <dp...@pgadmin.org> wrote: >>>> >>>> You're welcome. Sorry it took so long to realise the main issue was only >>>> applicable to Gunicorn! >>>> >>>>> On Mon, Mar 4, 2019 at 6:29 PM Shaheed Haque <srha...@theiet.org> wrote: >>>>> >>>>> Dave, >>>>> >>>>> Thanks for taking this forward, I look forward to 4.4! I also noted with >>>>> interest that we can use "pgAdmin4:app" rather than my hacky link to the >>>>> pgAdmin4.wsgi, so that means a completely hack-free solution :-). >>>>> >>>>> >>>>> Shaheed >>>>> >>>>>> On Mon, 4 Mar 2019 at 16:33, Dave Page <dp...@pgadmin.org> wrote: >>>>>> >>>>>> Hi >>>>>> >>>>>>> On Fri, Mar 1, 2019 at 9:30 AM Shaheed Haque <srha...@theiet.org> wrote: >>>>>>> >>>>>>> OK, I got it working. This is how... >>>>>>> >>>>>>>> On Mon, 25 Feb 2019 at 23:25, Shaheed Haque <srha...@theiet.org> wrote: >>>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> I'm a relative noob when it comes to the world of nginx, wsgi and so >>>>>>>> forth, but I do have several other things working (a Django app under >>>>>>>> gunicorn and the RabbitMQ web UI directly behind nginx). However, I'm >>>>>>>> rather stuck getting pgAdmin4 to run at http://mydomain.com:80/pgadmin >>>>>>>> behind nginx. Is there a simple, up-to-date example of how to do this >>>>>>>> (I'm running the latest, v4.2, of pgAdmin4)? >>>>>>>> >>>>>>>> I'm aware of threads such as >>>>>>>> https://www.postgresql.org/message-id/2197768425D7F5479A0FFB3FEC212F7FF602B871%40aesmail.surcouf.local, >>>>>>>> and several others but not been able to come up with a clear approach: >>>>>>>> >>>>>>>> One of the several variables I'm struggling to understand is the >>>>>>>> choice of whether to run pgAdmin4.py on port 5050 directly behind >>>>>>>> nginx, or as a WSGI app under gunicorn. I assume the latter should be >>>>>>>> easier to set up, but I've tried both (modelled on what I have >>>>>>>> working, and various references). One combination I tried was: >>>>>>>> >>>>>>>> - Creating a softlink from pgadmin4.py to pgAdmin4.wsgi >>>>>>>> - Using gunicorn to run the pgadmin4.py to a unix domain socket like >>>>>>>> this: >>>>>>>> >>>>>>>> $ /usr/local/bin/gunicorn -w 1 --bind >>>>>>>> unix:/home/ubuntu/pgadmin.sock pgadmin4:application >>>>>>>> >>>>>>>> - Serving behind nginx like this: >>>>>>>> >>>>>>>> location /pgadmin { >>>>>>>> rewrite ^/pgadmin/(.*) /$1 break; >>>>>>>> include proxy_params; >>>>>>>> proxy_pass http://unix:/home/ubuntu/pgadmin.sock; >>>>>>>> } >>>>>>>> >>>>>>>> But all I get is a stubborn 404. Any pointers welcome... >>>>>>> >>>>>>> First, I got over the 404s (caused, it seems, by me forgetting just how >>>>>>> much my browser had cached :-0). The next problem was with the nginx >>>>>>> config fragment: as soon as pgAdmin responded, it of course started the >>>>>>> browser looking for top level URLs such as /browser and /static which >>>>>>> are obviously not under /pgadmin. The to this key was a piece of code >>>>>>> in https://stackoverflow.com/a/50515636/6332554, which basically adds >>>>>>> the concept of a SCRIPT_NAME by hacking a small wodge of code into >>>>>>> pgAdmin4.py. >>>>>>> >>>>>>> The SCRIPT_NAME is set by an nginx fragment like this: >>>>>>> >>>>>>> location /pgadmin { >>>>>>> rewrite ^/pgadmin/(.*)$ /\$1 break; >>>>>>> include proxy_params; >>>>>>> proxy_pass http://unix:/home/$CLOUD_USER/pgadmin.sock; >>>>>>> proxy_set_header X-Script-Name /pgadmin; >>>>>>> } >>>>>>> >>>>>>> In addition to that change, as previously noted, I needed to create a >>>>>>> link to pgAdmin4.wsgi to allow gunicorn to pick it up. I change the >>>>>>> name I used so I ended up with the link being "wsgi.py" -> >>>>>>> "pgAdmin4.py", so the the corresponding gunicorn command is something >>>>>>> like this: >>>>>>> >>>>>>> gunicorn ... --bind unix:/.../pgadmin.sock wsgi:application >>>>>>> >>>>>>> Now, IIUC, the notion of SCRIPT_NAME is somewhat standard, and needed >>>>>>> to solve this issue of running pgAdmin in server mode, but sharing the >>>>>>> domain with other applications. Would there be interest in making the >>>>>>> needed code an integral part of pgAdmin? If so, I'd be happy to file a >>>>>>> feature request. >>>>>>> >>>>>>> Thanks, Shaheed >>>>>> >>>>>> >>>>>> Thanks for your work on this. >>>>>> >>>>>> I've committed a change to add the reverse proxy code, and to put some >>>>>> more examples in the docs: >>>>>> https://redmine.postgresql.org/projects/pgadmin4/repository/revisions/f401def044c8b47974d58c71ff9e6f71f34ef41d >>>>>> >>>>>> FWIW, I think the reason that this was an issue for so long is that you >>>>>> don't need the extra code if you use mod_wsgi or uWSGI - it's only >>>>>> needed with Gunicorn. I'll let you guess which of those technologies I'm >>>>>> most familiar with! >>>>>> >>>>>> Unfortunately this commit won't make the 4.3 release later this week, >>>>>> but it will be in 4.4. The instructions will still be good for scenarios >>>>>> other than Gunicorn in a sub-directory though. >>>>>> >>>>>> -- >>>>>> Dave Page >>>>>> Blog: http://pgsnake.blogspot.com >>>>>> Twitter: @pgsnake >>>>>> >>>>>> EnterpriseDB UK: http://www.enterprisedb.com >>>>>> The Enterprise PostgreSQL Company >>>> >>>> >>>> >>>> -- >>>> Dave Page >>>> Blog: http://pgsnake.blogspot.com >>>> Twitter: @pgsnake >>>> >>>> EnterpriseDB UK: http://www.enterprisedb.com >>>> The Enterprise PostgreSQL Company >> >> >> >> -- >> Dave Page >> Blog: http://pgsnake.blogspot.com >> Twitter: @pgsnake >> >> EnterpriseDB UK: http://www.enterprisedb.com >> The Enterprise PostgreSQL Company