4

I'm having difficulty with postgresql after installing via homebrew. I'm on Mac OS X 10.9.5 (just updated today and did restart).

Note I didn't deliberately change anything from a default postgresql installation via homebrew

PROBLEM

  • I can't uninstall postgresql
  • I can't log in to view tables / start the "command line" of postgres
  • createdb returns an error about pg_filenode.map "no such file or directory"
  • initdb returns error wondering where data_directory is (I don't know)

ANY OF THESE WOULD BE SUCCESS

  • Log in to psql (so I can create a database or table like I can do in mysql, browse existing tables)
  • Uninstall postgres altogether (so I can re-try with postgresql.app)

I've spent almost 10 hours troubleshooting this and come up short.

I've looked at loads of answers already (including SO questions 24132418 and 14510237) though I can't include all links due to not having reputation points yet

Any pointers would be really appreciated!

Below seems lengthy because I have pasted all the logs, please let me know if I have missed some important info though

Thanks, -Mark

DETAILS

I have been working my way through an introduction to Heroku, and they said installing postgresql was a requirment, so I did that using homebrew

brew install postgresql

I didn't check it, I proceeded building my app, but the next day I run the webapp locally and get error,

Request URL:    http://localhost:5000/admin/
Django Version: 1.6.5
Exception Type: OperationalError
Exception Value:    
FATAL:  could not open relation mapping file "global/pg_filenode.map": No such file or directory
Exception Location: /Users/macuser/Dropbox/code/heroku/awe01/lib/python2.7/site-packages/psycopg2/__init__.py in connect, line 164

So I want to investigate. Now I've never used postgresql before, so I want to "get to the command line" for postgresql

Please note, I'm a complete newbie and have never used postgresql before.

In mysql I know this would be

mysql -u root -p

(and then enter password)

I'm unable to do the equivalent in postgresql

  moriartymacbookair13:~ macuser$ postgres
  postgres does not know where to find the server configuration file.
  You must specify the --config-file or -D invocation option or set the PGDATA environment variable.
  moriartymacbookair13:~ macuser$ postgres -V
  postgres (PostgreSQL) 9.3.5

The more detailed heroku docs recommend installing postgresql using postgres.app I hadn't done this, I used homebrew, so I tried uninstalling postgresql

moriartymacbookair13:~ macuser$ brew uninstall postgres
Uninstalling /usr/local/Cellar/postgresql/9.3.5_1...
Error: Permission denied - /usr/local/bin/clusterdb

That didn't work, so back to where I was. To figure out what path to specify, I ran

brew info postgresql

If you scroll down to the bottom of this, you can see it advises me of the path

moriartymacbookair13:~ macuser$ brew info postgres
postgresql: stable 9.3.5 (bottled), devel 9.4beta2
http://www.postgresql.org/
Conflicts with: postgres-xc
/usr/local/Cellar/postgresql/9.3.5_1 (2927 files, 38M) *
  Poured from bottle
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/postgresql.rb
==> Dependencies
Required: openssl ✔, readline ✔
Recommended: ossp-uuid ✔
==> Options
--32-bit
    Build 32-bit only
--enable-dtrace
    Build with DTrace support
--no-perl
    Build without Perl support
--no-tcl
    Build without Tcl support
--with-python
    Build with python support
--without-ossp-uuid
    Build without ossp-uuid support
--devel
    install development version 9.4beta2
==> Caveats
If builds of PostgreSQL 9 are failing and you have version 8.x installed,
you may need to remove the previous version first. See:
  https://github.com/Homebrew/homebrew/issues/issue/2510

To migrate existing data from a previous major version (pre-9.3) of PostgreSQL, see:
  http://www.postgresql.org/docs/9.3/static/upgrading.html

When installing the postgres gem, including ARCHFLAGS is recommended:
  ARCHFLAGS="-arch x86_64" gem install pg

To install gems without sudo, see the Homebrew wiki.

To reload postgresql after an upgrade:
    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
Or, if you don't want/need launchctl, you can just run:
    postgres -D /usr/local/var/postgres

Note: I have ignored the comment at the top:

Conflicts with: postgres-xc
    /usr/local/Cellar/postgresql/9.3.5_1 (2927 files, 38M) *

Anyway there we have it, toward the end of that large output it confirms the path for me is /usr/local/var/postgres, so I tried -D

moriartymacbookair13:~ macuser$ postgres -D /usr/local/postgres
postgres cannot access the server configuration file "/usr/local/postgres/postgresql.conf": No such file or directory

So this time I specified the config file:

moriartymacbookair13:~ macuser$ postgres --config-file=/usr/local/var/postgres/postgresql.conf 
postgres does not know where to find the database system data.
This can be specified as "data_directory" in "/usr/local/var/postgres/postgresql.conf", or by the -D invocation option, or by the PGDATA environment variable.

(Out of desperation, I even tried deleting it and going again)

                moriartymacbookair13:~ macuser$ initdb /usr/local/var/postgres
        The files belonging to this database system will be owned by user "macuser".
        This user must also own the server process.
The database cluster will be initialized with locale "en_GB.UTF-8".
        The default database encoding has accordingly been set to "UTF8".
        The default text search configuration will be set to "english".

        Data page checksums are disabled.

        initdb: directory "/usr/local/var/postgres" exists but is not empty
        If you want to create a new database system, either remove or empty
        the directory "/usr/local/var/postgres" or run initdb
        with an argument other than "/usr/local/var/postgres".
        moriartymacbookair13:~ macuser$ rm -rf /usr/local/var/postgres
        moriartymacbookair13:~ macuser$ initdb /usr/local/var/postgres -E utf8
        The files belonging to this database system will be owned by user "macuser".
        This user must also own the server process.

        The database cluster will be initialized with locale "en_GB.UTF-8".
        The default text search configuration will be set to "english".

        Data page checksums are disabled.

        creating directory /usr/local/var/postgres ... ok
        creating subdirectories ... ok
        selecting default max_connections ... 100
        selecting default shared_buffers ... 128MB
        creating configuration files ... ok
        creating template1 database in /usr/local/var/postgres/base/1 ... ok
        initializing pg_authid ... ok
        initializing dependencies ... ok
        creating system views ... ok
        loading system objects' descriptions ... ok
        creating collations ... ok
        creating conversions ... ok
        creating dictionaries ... ok
        setting privileges on built-in objects ... ok
        creating information schema ... ok
        loading PL/pgSQL server-side language ... ok
        vacuuming database template1 ... ok
        copying template1 to template0 ... ok
        copying template1 to postgres ... ok
        syncing data to disk ... ok

        WARNING: enabling "trust" authentication for local connections
        You can change this by editing pg_hba.conf or using the option -A, or
        --auth-local and --auth-host, the next time you run initdb.

        Success. You can now start the database server using:

            postgres -D /usr/local/var/postgres
        or
            pg_ctl -D /usr/local/var/postgres -l logfile start


    moriartymacbookair13:~ macuser$ postgres -D /usr/local/postgres
    postgres cannot access the server configuration file "/usr/local/postgres/postgresql.conf": No such file or directory
    moriartymacbookair13:~ macuser$ postgres --config-file=/usr/local/var/postgres/postgresql.conf 
    postgres does not know where to find the database system data.
    This can be specified as "data_directory" in "/usr/local/var/postgres/postgresql.conf", or by the -D invocation option, or by the PGDATA environment variable.

So I took a look at that file:

In that in the conf file itself, the data variable is not defined

  moriartymacbookair13:~ macuser$ ls /usr/local/var/postgres/
  PG_VERSION       pg_ident.conf    pg_stat/         pg_xlog/
  base/            pg_multixact/    pg_stat_tmp/     postgresql.conf
  global/          pg_notify/       pg_subtrans/
  pg_clog/         pg_serial/       pg_tblspc/
  pg_hba.conf      pg_snapshots/    pg_twophase/
  moriartymacbookair13:~ macuser$ vim /usr/local/var/postgres/postgresql.conf 

shows that the value is commented out (see line 41... almost the whole file is commented out)

 35 # FILE LOCATIONS
 36 #-----------------------------------------------------------------------------    -
 37 
 38 # The default values of these variables are driven from the -D command-line
 39 # option or PGDATA environment variable, represented here as ConfigDir.
 40 
 41 #data_directory = 'ConfigDir'           # use data in another directory
 42                                         # (change requires restart)
 43 #hba_file = 'ConfigDir/pg_hba.conf'     # host-based authentication file
 44                                         # (change requires restart)
 45 #ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file
 46                                         # (change requires restart)
 47 
 48 # If external_pid_file is not explicitly set, no extra PID file is written.
 49 #external_pid_file = ''                 # write an extra PID file
 50                                         # (change requires restart)

HELP: DOES ANYONE KNOW WHAT I SHOULD SPECIFY THAT 'ConfigDir' AS for where data_directory is?

In case helpful here are contents of the Cellar folder

moriartymacbookair13:~ macuser$ ls /usr/local/Cellar/postgresql/9.3.5_1/
COPYRIGHT                       homebrew.mxcl.postgresql.plist
HISTORY                         include/
INSTALL_RECEIPT.json            lib/
README                          share/
bin/

(I don't understand why I have some postgres files in Cellar and some in usr/local/var)

I tried some other things too:

    moriartymacbookair13:~ macuser$ sudo -u postgres pg_ctl -D /usr/local/var/postgres -w start
    sudo: unknown user: postgres

That's based on other SO questions

    moriartymacbookair13:~ macuser$ ls -ld /usr/local/var/postgres/
    drwx------  19 macuser  admin   646B 20 Sep 19:46 /usr/local/var/postgres//
    moriartymacbookair13:~ macuser$ chown -R postgres /usr/local/var/postgres
    chown: postgres: illegal user name
    moriartymacbookair13:~ macuser$ brew uninstall postgresql
    Uninstalling /usr/local/Cellar/postgresql/9.3.5_1...
    Error: Permission denied - /usr/local/bin/clusterdb
    moriartymacbookair13:~ macuser$ brew uninstall postgres
    Uninstalling /usr/local/Cellar/postgresql/9.3.5_1...
    Error: Permission denied - /usr/local/bin/clusterdb
    moriartymacbookair13:~ macuser$ 

As I say, I installed Postgresql only to try out heroku, so here is the error Chrome gives me from the code when I run foreman start locally. (Note "the django app" is just a demo app https://devcenter.heroku.com/articles/getting-started-with-python#prepare-the-app) It works for localhost:5000 home, but when I add /admin (the page that would interact with a database), I get the following error:

OperationalError at /admin/
FATAL:  could not open relation mapping file "global/pg_filenode.map": No such file or directory
Request Method: GET
Request URL:    http://localhost:5000/admin/
Django Version: 1.6.5
Exception Location: /Users/macuser/Dropbox/code/heroku/awe01/lib/python2.7/site-packages/psycopg2/__init__.py in connect, line 164
Python Executable:  /Users/macuser/Dropbox/code/heroku/awe01/bin/python

Full error traceback log here: http://dpaste.com/3CREGVQ

Note this answer https://stackoverflow.com/a/5053003/870121 recommends createdb not just initdb

And the above error is the same as if I run createdb:

moriartymacbookair13:~ macuser$ createdb /usr/local/var/postgres/
createdb: could not connect to database template1: FATAL:  could not open relation mapping file "global/pg_filenode.map": No such file or directory

Steps advised here Postgres is failing with 'could not open relation mapping file "global/pg_filenode.map" ' are

Remove and re-add the launch agent
Kill the processes for <postgresql version number>
Initialize the db initdb /usr/local/var/postgres
Restart my computer

If this is relevant someone please tell me how to "Remove and re-add the launch agent"? Is is this? (based on the output of the brew info postgresql from earlier)

moriartymacbookair13:~ macuser$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
moriartymacbookair13:~ macuser$ killall postgresql
No matching processes belonging to you were found
moriartymacbookair13:~ macuser$ killall postgres
No matching processes belonging to you were found
moriartymacbookair13:~ macuser$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

FINALLY In case it inspires anyone,

moriartymacbookair13:~ macuser$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!

Warning: The /usr/local directory is not writable.
Even if this directory was writable when you installed Homebrew, other
software may change permissions on this directory. Some versions of the
"InstantOn" component of Airfoil are known to do this.

You should probably change the ownership and permissions of /usr/local
back to your user account.

Warning: Unbrewed dylibs were found in /usr/local/lib.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected dylibs:
    /usr/local/lib/libguide.dylib
    /usr/local/lib/libKLF_OGL.dylib

Warning: Some directories in your path end in a slash.
Directories in your path should not end in a slash. This can break other
doctor checks. The following directories should be edited:
    $/Users/macuser/Dropbox/code/aws/ElasticBeanstalkCommandLineTools/AWS-ElasticBeanstalk-CLI-2.6.3/AWSDevTools.sh/macosx/python2.7/    /Users/macuser/Dropbox/code/aws/ElasticBeanstalkCommandLineTools/AWS-ElasticBeanstalk-CLI-2.6.3/AWSDevTools/eb/macosx/python2.7/

Warning: /usr/bin occurs before /usr/local/bin
This means that system-provided programs will be used instead of those
provided by Homebrew. The following tools exist at both paths:

    git
    git-cvsserver
    git-receive-pack
    git-shell
    git-upload-archive
    git-upload-pack

Consider setting your PATH so that /usr/local/bin
occurs before /usr/bin. Here is a one-liner:
    echo export PATH='/usr/local/bin:$PATH' >> ~/.bash_profile
moriartymacbookair13:~ macuser$ 

Earlier today I had this error createdb: could not connect to database postgres: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

as per http://www.postgresql.org/docs/9.3/interactive/tutorial-createdb.html but that error seems to have gone away now

Any advice on un or re-installing postgresql, resolving the unknown user: postgres error, setting location of #data_directory = 'ConfigDir' or any other tips... I would really appreciate it. It's been a full day lost to this now so I would appreciate anything at all.

Community
  • 1
  • 1
Mark
  • 907
  • 14
  • 24
  • Note, when I tried to use the postgres.app installer now it told me "Could not start on Port 5432" and froze during installation – Mark Sep 20 '14 at 20:24

2 Answers2

5

FATAL: could not open relation mapping file "global/pg_filenode.map": No such file or directory

You had a PostgreSQL install, but deleted or moved the data directory while the server was running. Or you installed it on a removable disk that you then removed. Or some application on your system is messing with how other apps change files.

  moriartymacbookair13:~ macuser$ postgres
  postgres does not know where to find the server configuration file.

postgres is the server application. The client is psql. However, if global/pg_filenode.map is missing you're not going to have any more luck with psql.

  moriartymacbookair13:~ macuser$ brew uninstall postgres

sudo brew uninstall postgres

Anyway there we have it, toward the end of that large output it confirms the path for me is /usr/local/var/postgres, so I tried -D

moriartymacbookair13:~ macuser$ postgres -D /usr/local/postgres
postgres cannot access the server configuration file "/usr/local/postgres/postgresql.conf": No such file or directory

You got the path wrong. Note what "brew info" said:

    Or, if you don't want/need launchctl, you can just run:
    postgres -D /usr/local/var/postgres

As for the postgres user:

moriartymacbookair13:~ macuser$ sudo -u postgres pg_ctl -D /usr/local/var/postgres -w start
sudo: unknown user: postgres

I think some Mac OS X installs use _postgres or postgres_. I don't have a mac, so I can't check. But it doesn't matter in your case anyway, because the datadir is owned by your user, not postgres:

moriartymacbookair13:~ macuser$ ls -ld /usr/local/var/postgres/
drwx------  19 macuser  admin   646B 20 Sep 19:46 /usr/local/var/postgres//

It looks to me like you or some tool on your system has mangled your PostgreSQL data directory, corrupting it. This shouldn't happen, so I'd be making an effort to find out what removed pg_filenode.map and how/when.

If there is no data you care about in the data directory, you should delete it and re-initdb.

I don't have a Mac and I can't see how Homebrew configures your PostgreSQL install's startup, but it sounds like it probably runs postgres as user macuser. In which case, just:

launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
rm -rf /usr/local/var/postgres
initdb -D /usr/local/var/postgres -U postgres --auth-local peer --auth-host md5 -E utf-8l
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

Finally, re:

Note, when I tried to use the postgres.app installer now it told me "Could not start on Port 5432" and froze during installation

at a guess, when you tried that you had the postgres server from Homebrew already running on 5432, but nonfunctional because of the damaged data directory.

So you really have two things here:

  • Re-initdb the datadir to get PostgreSQL working again; and
  • Figure out how it got damaged in the first place
Craig Ringer
  • 259,831
  • 56
  • 584
  • 684
  • Thanks! I worked through your answer including running `sudo brew uninstall postgres`, which ran STATUS - `/usr/local/Cellar` folder now does NOT contain any `postgresql` folder - `postgresql` or `psql` are not recognised commands WHAT NEXT? - Do I need to delete the folder, `/usr/local/var/postgres` which still exists? - Should I now run the postgres.app installer? I'm reluctant to do either w/o encouragement in case I'm still half way through (un)install – Mark Sep 21 '14 at 03:46
  • Here are the contents of existing `/usr/local/var/postgres` folder: `moriartymacbookair13:~ macuser$ cd /usr/local/var/postgres/` ... `moriartymacbookair13:postgres macuser$ ls` ... `PG_VERSION pg_ident.conf pg_stat/ pg_xlog/ base/ pg_multixact/ pg_stat_tmp/ postgresql.conf global/ pg_notify/ pg_subtrans/ postmaster.opts pg_clog/ pg_serial/ pg_tblspc/ postmaster.pid pg_hba.conf pg_snapshots/ pg_twophase/ server.log` – Mark Sep 21 '14 at 03:50
  • PS earlier in the day I hadn't missed the "`var`" and the result was the same with the proper path you pointed out `postgres -D /usr/local/var/postgres` As for rest of your answer, I haven't worked through it yet as I need to do un/re-install first. Commands in terminal `initdb`, `postgresql`, `createdb` return "command not found" for now – Mark Sep 21 '14 at 03:54
  • Thanks again @Craig, the sudo brew seems to have been a safe and effective option here, then postgres.app was able to do its thing. Full summary added as separate answer. – Mark Sep 21 '14 at 18:45
  • It also solved the problem for those upgrading to Mac OS Yosemite. – Joao Cunha Oct 22 '14 at 02:24
1

SOLUTION to the problem I posted

  1. sudo brew uninstall postgresql (literally, sudo solved my problem... I had read that sudo brew can be dangerous but it worked well in this case)
  2. Restart
  3. Tried to run postgres.app ...got error
  4. Restart
  5. Fully uninstalled postgres.app (following instructions on site: quit, drag to the Trash, and then "Finder > Empty Trash..." as per http://postgresapp.com/documentation/install.html)
  6. Restart
  7. Delelted data folder as per trouble shooting instructions of postgresapp i.e., the 5 steps here: Resetting Postgres.app http://postgresapp.com/documentation/troubleshooting.html (I may have done this earlier, I forget the order of steps 5/7)
  8. Restart
  9. Re-installed postgresql via postgres.app
  10. Added the path to my /etc/profile file... adding to ~/.bashrc or ~/.bash_profile doesn't work for me for some reason. Here in an

Extract from /etc/profile for me

It might be from another file for you, see https://apple.stackexchange.com/questions/12993/why-doesnt-bashrc-run-automatically#comment13715_13019

 # 1:
 # For postgresql postgres postgres.app:
 # Otherwise psql isn't a recognised command
 # Based on http://postgresapp.com/documentation/cli-tools.html
export PATH=$PATH:/Applications/Postgres.app/Contents/Versions/9.3/bin
 # 2:
 # And this from https://devcenter.heroku.com/articles/heroku-postgresql#local-setup
export PATH="/Applications/Postgres93.app/Contents/MacOS/bin:$PATH:$PATH"
 # 3:
 # And now this based on error of file not existing
 # from http://stackoverflow.com/questions/13868730/socket-file-var-pgsql-socket-s-pgsql-5432-missing-in-mountain-lion-os-x-ser -- don't think this made a difference though
export PGHOST=localhost

I think this is overkill; the first change is definitely useful as it allows me to go straight to psql just by typing "psql" in terminal (I personally didn't even need -h localhost); I'm less sure of the need of the other two additions

That's it.


HOW IT GOT DAMAGED IN THE FIRST PLACE

I haven't figured this out.


OTHER TIPS FOR ANY MAC USER WHO'S USING DJANGO ON HEROKU WITH POSTGRESQL

In case relevant, now that it's working, here are some more steps I've finished to get fully set up and comfortable with postgres and my new heroku app. This has been my first experience with heroku, django and postgresql so I have tried to note all details which struck me!

Note: I had locally finished the tutorial for the "polls" sample app (from https://docs.djangoproject.com/en/1.6/intro/tutorial01/). My goal was to add this /polls app to the "getting started" django sample app (from https://devcenter.heroku.com/articles/getting-started-with-python) (Note: I chose django 1.6 since it seems to be the latest version supported by heroku right now.)

I am running Mac OS X 10.9.5 but some of my comments may be helpful for anyone confused about local/heroku postgres integration

Create a local postgres db to use with django app

  1. Once postgres app is running (launched by double-clicking the program in Applications -> Postgres, then look out for the elephant in the notification bar if you're on a Mac), I can log in to psql. But first straight from the command line, I made a database by command

createdb cool01db

Note if you get this, psql: could not connect to server: Connection refused Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 5432? or similar error, then you haven't set up the postgres app/server correctly, so don't proceed through my instructions

  1. Now I could log in to psql as per instructions on http://postgresapp.com/documentation/cli-tools.html psql cool01db Running the psql command \d shows me they're nothing in this database yet; tables will be created automatically by django when I do my syncdb command

  2. Note: Since I had already completed the polls tutorial elsewhere, I had copied the "polls" folder (which contains things like models.py) into the folder of my heroku sample app, so "polls" was a folder alongside "gettingstarted" and "hello". Therefore I also added "polls" to the list of "installed apps" in the gettingstarted/settings.py as per https://docs.djangoproject.com/en/1.6/intro/tutorial01/#activating-models

  3. I edited the gettingstarted/settings.py file as per instructions on the django tutorial https://docs.djangoproject.com/en/1.6/intro/tutorial01/#database-setup and https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-DATABASES For me, this looked like:

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'cool01db', 'USER': '', 'PASSWORD': '', 'HOST': 'localhost', # '127.0.0.1' probably works also 'PORT': '5432', } }

To use the newly-created local postgres DB and not the heroku one

  1. I commented out this link in gettingstarted/settings.py

# DATABASES['default'] = dj_database_url.config()

This is as per excellent comment, http://stackoverflow.com/a/16422414/870121

  1. I navigated into the project folder (which contains the above three folders and files like manage.py) and ran (locally, not on heroku) python manage.py syncdb Here I was prompted to create a superuser with a password

Note, now the tables for the heroku sample app (tables like hello_greeting) and the django polls app (tables like polls_choice and polls_question) are all automatically created in the local postgres db, and I can view them if I log in to psql (psql cool01db from the terminal) and type \d (once you're in)

  1. I ran foreman start and navigated to http://localhost:5000/admin/ and entered my superuser username and password I had just created. This successfully logged me in to the /admin site powered by my LOCAL postgres database
  2. I saw the admin panel with the opportunity to add a Question as per django tutorial, so I added a question with some answers as per https://docs.djangoproject.com/en/1.6/intro/tutorial02/#make-the-poll-app-modifiable-in-the-admin
  3. Now I visited http://localhost:5000/polls and sure enough it was working
  4. If in the terminal I ran psql cool01db and then the sql command \d I could see the tables, and select * from question_choice showed me the updates just made. Very satisfying.

To use the heroku postgres db in development

  1. I uncommented this line in gettingstarted/settings.py

DATABASES['default'] = dj_database_url.config()

  1. I ran heroku config Knew to do this from https://devcenter.heroku.com/articles/getting-started-with-python#define-config-vars Output was this:

(awe01)moriartymacbookair13:getstartapp macuser$ heroku config === awe01 Config Vars DATABASE_URL: postgres://aqmorelettersqz:uqry_pnFmorelettersYf@ec2-XX-XXX-XX-XX.compute-1.amazonaws.com:5432/dbmorelettersce HEROKU_POSTGRESQL_YELLOW_URL: postgres://aqmorelettersqz:uqry_pnFmorelettersYf@ec2-XX-XXX-XXX-XX.compute-1.amazonaws.com:5432/dbmorelettersce PAPERTRAIL_API_TOKEN: kmorelettersx TIMES: 2 (awe01)moriartymacbookair13:getstartapp macuser$

Then I pasted all of that into the hidden file .env which lies in the same folder as manage.py

Syntax note: this means the file .env looked like this:

TIMES=2 DATABASE_URL=postgres://aqmorelettersqz:uqry_pnFmorelettersYf@ec2-XX-XXX-XX-XX.compute-1.amazonaws.com:5432/dbmorelettersce HEROKU_POSTGRESQL_YELLOW_URL=pos.... etc

...i.e., with = signs but no spaces around them (and no comments in this file)

Note, this involved deleting the original "DATABASE_URL=" entry from the .env file

As far as I understand, the .env file is what your local machine sees, but the output of "heroku config" is what the heroku machine sees (corrections welcome), so I wanted them to match.

  1. NB: Once Postgres is installed and you can connect, you’ll need to export the DATABASE_URL environment variable for your app to connect to it when running locally.

Run command export DATABASE_URL=postgres:///$(whoami)

This tells Postgres to connect locally to the database matching your user account name (which is set up as part of installation).

That's from https://devcenter.heroku.com/articles/heroku-postgresql#local-setup

Note (to self): I don't understand what happens here (I can't see a file that's changed as a result of running this, or what exactly happens). But I did a restart of computer and everything still works, I didn't need to run this again.

  1. Now on a heroku dyno I ran "syncdb" heroku run python manage.py syncdb

(You will be prompted to create a superuser only if you haven't already done so)

  1. I went to myappname.herokuapp.com/admin and logged in with the superuser account created for heroku postgresql (which I have the same as local for convenience). There I was able to add a question, and this time this question is added to the heroku postgresql db. Visiting myappname.herokuapp.com/polls shows me that question available for votes

I think that's it

Now if I do foreman start, what I see at /db or /polls is the same as if I visit my locallhost:5000 or myappname.herokuapp.com, since both are using the heroku postgresdb (I don't even need my postgres server running)

  1. To view tables and run commants like \dt or SELECT * FROM... I can do a command heroku pg:psql as per https://devcenter.heroku.com/articles/getting-started-with-python#provision-a-database

Thanks Craig Ringer for the original answer.

Community
  • 1
  • 1
Mark
  • 907
  • 14
  • 24