docker安装postgresql
docker安装postgresql
docker如何安装postgresql ,以及php如何来操作postgresql 。
安装
docker run -d \
--name pg10.12 \
-v /data/postgresql:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=123456 \
-p 5432:5432 \
--restart=always \
postgres:10.12
如果创建时未指定 –restart=always ,可通过 update 命令 ,如下:
docker update --restart=always some-postgres
使用
可以使用navicat来进行连接,测试。能连接,但是可能是版本低,无法执行创建库、数据表的操作。
PostgreSql知识
参考文章:文章
与mysql对比
PostgreSql跟mysql还是有区别的,在查询方面,mysql使用Esc下面键的符号作为分隔,而PostgreSql使用双引号。
limit差别 ,每页两项,查询第10页
# mysql limit 2*(10-1),2 # postgreSql limit 2 offset 2*(10-1)
建表语句,比如指定了
ENGINE=MyISAM DEFAULT CHARSET=utf8;在PostgreSql中是无效的。CREATE TABLE `student` ( `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, `cat_id` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;pg
create table TESTCASE( id INTEGER, task_class INTEGER, age TEXT, PRIMARY KEY(id, task_class) );
数据类型
1.基本类型:Integer, Numeric, String, Boolean
2.结构类型:Date/Time, Array, Range, UUID
3.文档类型:JSON/JSONB, XML, Key-value(Hstore)
4.几何类型:Point, Line, Circle, Polygon
5.自定义类型:Composite, Custom Types
php操作Pg数据库
如果是安装编译阶段,可以使用下面的指令指定,该扩展。
./configure --with-pdo-pgsql
php.ini
没有改扩展,在使用 new Pdo 来构建对象的时候,可能报错。
extension=pdo_pgsql
另外一种方式,使用函数来操作,需要安装扩展。这里省略。
$conn_string = "host=localhost port=5432 dbname=db_name user=root password=123456" ;
$dbconn = pg_connect($conn_string);
windows
使用phpstudy,里面有,只需在php.ini中开启配置即可。
Linux安装pdo_pgsql扩展
想从pecl获取源码,结果发现其上面的源码比较老久,大概是2006年的,然后勉强下载了,还提示解压有点问题,然后忽略,继续安装扩展,结果make的时候,直接报错,就停止了。
由于windows下面,有直接现成的,只需要去掉扩展前面的的注释即可。然后,我在想,Linux下面怎么搞呢?居然藏在php的源码里面,然后我顺手,就把我电脑里面,存放的php7.3的源码,翻出来。在标准扩展ext目录下找到了文件。压缩zip格式文件,上传到Linux环境,然后按常规php安装方式,顺利的安装成功。
附php源码下载地址:https://www.php.net/downloads.php
如下:
unzip pdo_pgsql.zip
cd pdo_pgsql/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
sudo make install
#rm pdo_pgsql.zip
#rm -rf pdo_pgsql/
在php.ini中开启扩展
extension=pdo_pgsql
备注:另外还有一个pg的扩展,好像还有异步操作的特性。版本也比较新,但是git上星比较少。
出错处理:
若报如下错误:
configure: error: Cannot find libpq-fe.h. Please specify correct PostgreSQL installation path
则执行:
yum -y install postgresql-devel
new Pdo
可以使用下面三种方式,来操作。
//方式一:DSN + 数据库名称
$pdo = new Pdo('pgsql:host=10.20.24.70;port=5432;dbname=testdb;user=postgres;password=123456;');
//方式一:DSN + 无数据库名称
$pdo = new Pdo('pgsql:host=10.20.24.70;port=5432;user=postgres;password=123456;');
//方式一:DSN + 分开
define('DB_DSN','pgsql:host=10.20.24.70;port=5432;dbname=testdb;');
define('DB_USER','postgres');
define('DB_PASS','123456');
$pdo = new \PDO(DB_DSN, DB_USER, DB_PASS, array(
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
));
创建数据库
假设按前面的步骤已经正确的连上了数据库。创建数据库如下:
$pdo->exec('create database testdb;');
创建表
$sql = <<<EOL
create table TEST1(
id INTEGER,
task_class INTEGER,
age TEXT,
PRIMARY KEY(id, task_class)
);
EOL;
$data = $pdo->exec($sql);
var_dump($data); //操作成功,返回 int(0),感觉好奇怪
增删改查
假设使用snippet的database,如下:
//查询
$db = Database::getDb();
$data = $db->getOne('testcase','*','1=1');
var_dump($data);
$data = $db->getAll('testcase','*','1=1');
var_dump($data);
//插入
// 与mysql最大的语法区别,不能使用 来进行分隔字段 `。
$row = [
'id'=>4,
'task_class'=>12,
'age'=>'15',
];
$data = $db->insert('testcase',$row);
var_dump($data);
//修改 也取消了掉了 ` 的分隔符号。
$row = [
'age'=>'zhangsanshuo',
];
$data = $db->update('testcase',$row , 'where id = :id',['id'=>2]);
var_dump($data);
//删除 好奇怪,删除不存在的条目,也返回为 真。
$data = $db->remove('testcase','id=:id',['id'=>4]);
var_dump($data);
问题排查
pg_hba.conf访问权限
以下是pdo_pgsql扩展访问时遇到的错误,
SQLSTATE[08006] [7] FATAL: no pg_hba.conf entry for host "10.131.39.144", user "gpadmin", database "develop",
网上说,要解决这个问题,只需要在PostgreSQL数据库的安装目录下找到/data/pg_hba.conf,找到“# IPv4 local connections:” 在其下加上请求连接的机器IP
host all all 127.0.0.1/32 md5
32是子网掩码的网段;md5是密码验证方法,可以改为trust。
但实际上,我在docker文件里面,并没有找到该文件。另外,pgadmin工具连接时,没有权限时,大概也报了一个同样的错误。