Ubuntu 安装 PostgreSQL 和 python-psycopg2基础教程(以及错误解决)

Django支持以下四种数据库PostgreSQL(pgql)、SQLite 3、MySQL、Oracle。PostgreSQL 和 MySQL都是最受人关注的开源数据库,MySQL在国内又相对盛行,这和php领域大力推崇lamp不无关系; 关于Mysql和PostgreSQL的对比网上有很多版本,也没必要去比较,不过可以确定的一点是PostgreSQL对Django的 GIS支持更加强大。在Ubuntu 系统下为Python Django安装 PostgreSQL 数据库,还包括pgadmin3 和 python-psycopg2 等。

安装PostgreSQL 数据库

sudo apt-get install postgresql postgresql-client postgresql-contrib

安装过程提示:

The following NEW packages will be installed:
libossp-uuid16 libpq5 postgresql postgresql-8.4 postgresql-client
postgresql-client-8.4 postgresql-client-common postgresql-common
postgresql-contrib postgresql-contrib-8.4
……
Adding user postgres to group ssl-cert
……
Creating new cluster (configuration: /etc/postgresql/8.4/main, data: /var/lib/postgresql/8.4/main)…
Moving configuration file /var/lib/postgresql/8.4/main/postgresql.conf to /etc/postgresql/8.4/main…
Moving configuration file /var/lib/postgresql/8.4/main/pg_hba.conf to /etc/postgresql/8.4/main…
Moving configuration file /var/lib/postgresql/8.4/main/pg_ident.conf to /etc/postgresql/8.4/main…
Configuring postgresql.conf to use port 5432…
……
* Starting PostgreSQL 8.4 database server [ OK ]
Setting up postgresql (8.4.8-0ubuntu0.11.04) …
Setting up postgresql-client (8.4.8-0ubuntu0.11.04) …
Setting up postgresql-contrib-8.4 (8.4.8-0ubuntu0.11.04) …
Setting up postgresql-contrib (8.4.8-0ubuntu0.11.04) …
Processing triggers for libc-bin …

即创建了配置文件的位置为:/etc/postgresql/8.4/main/
可执行程序为:

 sudo /etc/init.d/postgresql {start|stop|restart|reload|force-reload|status}

PostgreSQL 默认配置了允许本地机器访问(local access)的权限,PostgreSQL 安装完毕,使用系统账户postgres以postgres角色登录数据库设置密码,命令:

sudo -u postgres psql。

登录sql命令界面后,修改 postgres 用户的密码(psql-PostgresQL的命令行客户端):

postgres=# ALTER ROLE postgres WITH ENCRYPTED PASSWORD ‘mypassword’;
postgres=# \q

设置PostgreSQL启用远程访问

1. 这里设置允许远程连接权限:sudo vi /etc/postgresql/8.4/main/postgresql.conf

#listen_addresses = ‘localhost’ 去掉注释并修改为 listen_addresses = ‘*’
#password_encryption = on 去掉注释:password_encryption = on

2. 这里设置允许远程进行数据库操作:sudo vi /etc/postgresql/8.4/main/pg_hba.conf
最后添加一行(允许局域网ip段或其他任何ip):host all all 192.168.1.0/24 md5 其中24是CIDR地址,也可用网关代替。

——————–最后pg_hba.conf可能为这样———————-

# Database administrative login by UNIX sockets
local all postgres ident
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# “local” is for Unix domain socket connections only
local all all ident
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
host all all 192.168.1.0/24 md5

修改linux 用户postgres的密码

sudo passwd -d postgres 删除密码

sudo su postgres -c passwd 设置密码(su 切换当前用户到postgres)

PostgreSQL创建用户和数据库

登录后使用sql语句:

create user “pytu” with password ‘mypassword’ nocreatedb;

CREATE DATABASE pytb OWNER pytu ENCODING ‘UTF-8′;

或命令行使用命令创建:

sudo -u postgres createuser -D -P dbuser 弹出设置密码

sudo -u postgres createdb -O dbuser mydb

最后经过上面的配置记得重启:sudo /etc/init.d/postgresql restart
Ubuntu 10.04: /etc/init.d/postgresql-8.4 restart

安装 PostgreSQL 数据库管理工具 pgadmin3

sudo apt-get install pgadmin3

实现和php 下的Mysql 管理工具 phpmyadmin类似的可视化数据库管理界面,终端输入pgadmin3启动时,Ubuntu 11.04下出现如下错误提示,不知是何原因:

** (pgadmin3:5579): CRITICAL **: murrine_style_draw_flat_box: assertion `width >= -1′ failed

为了启用pgAdmin 的一些功能,必须运行下面这段脚本(To enable the functions of the pgAdmin utility, run a script against the postgres database):

sudo -u postgres psql -d postgres < /usr/share/postgresql/8.4/contrib/adminpack.sql

提示CREATE FUNCTION创建函数。不同Ubuntu版本,文件路径可能不同:如Ubuntu老版本使用pgAdmin8.1的路径是:
/usr/share/postgresql/8.1/contrib/admin81.sql on current versions of Ubuntu.

安装 psycopg2

最后安装Python 的 PostgreSQL数据库驱动psycopg2:

sudo apt-get install python-psycopg2

验证psycopg2安装:

>>> python
>>> import psycopg2
>>> psycopg2.apilevel
’2.0′

Ubuntu 下,Python PostgreSQL 数据库的安装和配置基本就完成了,有点要注意的是使用django-admin新建django 项目时候,源文件最好不要放在apache 或其他web 服务器的document root下,可能会被人看到源代码。

FATAL: Ident authentication failed for user 问题

当新建一个python project 并在settings.py 中输入以下数据库信息之后:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'mydb', # Or path to database file if using sqlite3.
'USER': 'dbuser', # Not used with sqlite3.
'PASSWORD': 'mypassw', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
测试PostgreSQL连接:

$ python manage.py shell
>>> from django.db import connection
>>> cursor = connection.cursor()

出现错误:

Traceback (most recent call last):
File “”, line 1, in
File “/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/db/backends/__init__.py”, line 250, in cursor
cursor = self.make_debug_cursor(self._cursor())
File “/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/db/backends/postgresql_psycopg2/base.py”, line 140, in _cursor
self.connection = Database.connect(**conn_params)
OperationalError: FATAL: Ident authentication failed for user “dbuser”

出现这个错误的原因还是在于上面pg_hba.conf 文件的设置,Debian系(包括ubuntu)默认的pg_hba.conf 文件对于localhost本地机器的数据库访问方式是ident,它指的是只有Linux shell用户通过同名的postgreSQL 用户才能访问,也就是pg超级用户postgres 只能由linux 用户postgres 登录后操作。要解决类似OperationalError: FATAL: Ident authentication failed for user “postgres”的问题,有两种解决方法:

1. 在执行$ python manage.py shell之前先$su postgres 切换为postgres 用户

2. 修改pg_hba.conf 的客户端访问设置,将laocal 的访问由ident 改为trust,如:

# TYPE DATABASE USER CIDR-ADDRESS METHOD
local all all trust

修改完pg_hba.conf设置记得重启pg。安装了pg_ctl 也可以用pg_ctl reload。

相关推荐

3 thoughts on “Ubuntu 安装 PostgreSQL 和 python-psycopg2基础教程(以及错误解决)”

Leave a Comment