Ubuntu 安装 PostgreSQL 和 python-psycopg2

作者 FarLee 2011年10月15日 21:54:05   ‖浏览(12,668)

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

PostgreSQL Ububtu

安装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


“Ubuntu 安装 PostgreSQL 和 python-psycopg2”文章评论(3)

  1. 感谢博主的分享,有空欢迎来我的站看看,多多指教!

  2. 博主的域名感觉非常好,让我学习了一点知识,看了这个文章,我还是有很多地方不理解,不知道是因为我刚刚学习wordpress的原因还是怎么了,不过我觉得不断的学习还是对自己能力的提升,我也学习并且做了一个博客,希望能得到博主的光临并且给一些意见,因为我是菜鸟,很多东西都不知道很明白,错的不对的地方也有很多,需要去改进,首先感谢你了,让我学习并且收获了很多。

    • I genuinely enjoy studying on this website, it has wonderful content. ὖDon’t put too fine a point to your wit for fear it should get blunted.” by Miguel de Cervantes.

来说兩句