Ubuntu 安装 PostgreSQL 和 python-psycopg2基础教程(以及错误解决)2012/06/27 by Crazyant    3条评论    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-clientpostgresql-client-8.4 postgresql-client-common postgresql-commonpostgresql-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 = on2. 这里设置允许远程进行数据库操作: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 socketslocal all postgres ident# TYPE DATABASE USER CIDR-ADDRESS METHOD# “local” is for Unix domain socket connections onlylocal all all ident# IPv4 local connections:host all all 127.0.0.1/32 md5# IPv6 local connections:host all all ::1/128 md5host 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 restartUbuntu 10.04: /etc/init.d/postgresql-8.4 restart安装 PostgreSQL 数据库管理工具 pgadmin3sudo 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提示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, inFile “/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/db/backends/__init__.py”, line 250, in cursorcursor = 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 _cursorself.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 METHODlocal all all trust修改完pg_hba.conf设置记得重启pg。安装了pg_ctl 也可以用pg_ctl reload。
11-25 01:54