本文将介绍从PostgreSQL到XML的3个表的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于centos7下源码编译安装php支持Postgr
本文将介绍从PostgreSQL到XML的3个表的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于centos 7下源码编译安装php支持PostgreSQL postgresql手册 postgresql官网下载 postgresql视频教、linux – 从postgresql 9.3迁移到9.4,postgis、Postgres-XL:基于PostgreSQL的开源可扩展数据库集群、postgresql – Postgres pg_toast在autovacuum – 哪个表?的知识。
本文目录一览:- 从PostgreSQL到XML的3个表
- centos 7下源码编译安装php支持PostgreSQL postgresql手册 postgresql官网下载 postgresql视频教
- linux – 从postgresql 9.3迁移到9.4,postgis
- Postgres-XL:基于PostgreSQL的开源可扩展数据库集群
- postgresql – Postgres pg_toast在autovacuum – 哪个表?
从PostgreSQL到XML的3个表
我是一个小的开发团队的实习生,我的项目负责人希望我编写一个函数,该函数将PostgreSQL数据导出到XML文件。不幸的是,我只知道如何将导出内容写入csv。
有3个不同的表,他希望这样(XML视图)
<Table 1 Col1=".." Col2=".."> <Table 2 Col1="..."> <Table3 Col1=".." Col2="" Col3=".." Col4="..." /> <Table3 Col1=".." Col2="" Col3=".." Col4="..." /> <Table3 Col1=".." Col2="" Col3=".." Col4="..." /> </Table2> <Table1> <Table1>....</Table> </Table></Table2><Table1 Col1="xxx" Col2="xxx"> ...
这些标签分别用于我的表名。如何编写代码以导出此代码?
关于StackOverflow的其他问题主要集中在导出单个表上,因此我希望这个问题也可以帮助其他尝试导出多个表的人。
答案1
您有三层嵌套表。
样本数据:
CREATE TABLE a( a_id integer primary key, name text);CREATE TABLE b( b_id integer primary key, a_id integer references a(a_id), val text);CREATE TABLE c( c_id serial primary key, b_id integer references b(b_id), blah text);INSERT INTO a(a_id, name) VALUES (1, ''fred''),(2, ''bert'');INSERT INTO b(b_id, a_id, val) VALUES (11, 1, ''x''), (12, 1, ''y''), (21, 2, ''a''), (22, 2, ''b'');INSERT INTO c(b_id, blah) VALUES(11, ''whatever''), (11, ''gah''), (12, ''borkbork''), (22, ''fuzz'');
方法1:进行左联接,在客户端中处理XML
处理此问题的最简单方法是对所有三个表进行左联接,从最外到最内的顺序进行排序。然后,您迭代结果集,每当该级别的主题发生变化时,关闭一个元素,然后打开另一个元素。
select *from a left join b on (a.a_id = b.a_id) left join c on (b.b_id = c.b_id)order by a.a_id, b.b_id, c.c_id;
然后循环返回的行,并为每行 伪代码 :
cur_row = get_new_row()if (cur_row[b_id] != prev_row[b_id]) { emit_close_tableb();}if (cur_row[a_id] != prev_row[a_id]) { emit_close_tablea(); emit_open_tablea(cur_row);}if (cur_row[b_id] != prev_row[b_id]) { emit_open_tableb(cur_row);}emit_tablec(cur_row);prev_row = cur_row;
要编写XML,可以使用XMLWriter
。要读取查询数据,可以使用PDO之类的东西或您喜欢的任何驱动程序。如果数据集很大,请考虑使用游标读取数据。
这很好用,但是它传输了 很多 多余的数据,因为您n
为n
与之关联的内部表的每一行传输了外部表的数据的副本。
为了减少交换的多余数据,您只能选择外部表的ID
select a.a_id, b.b_id, c.*from a left join b on (a.a_id = b.a_id) left join c on (b.b_id = c.b_id)order by a.a_id, b.b_id, c.c_id;
…然后,当您切换到新的tablea /
tableb时,SELECT
其余的行就会出现。您可能会使用第二个连接来执行此操作,这样就不会破坏从中读取行的主连接上的结果集和光标状态。
方法2:在PostgreSQL中全部完成
对于较小的数据集或较大数据集的内部级别,可以使用PostgreSQL的XML支持来构造XML文档,例如:
WITH xmlinput AS ( SELECT a, b, c FROM a LEFT JOIN b ON (a.a_id = b.a_id) LEFT JOIN c on (b.b_id = c.b_id) ORDER BY a.a_id, b.b_id, c.c_id)SELECT XMLELEMENT(name items, xmlagg( XMLELEMENT(name a, XMLFOREST((a).a_id AS a_id, (a)."name" AS name), b_xml ) ORDER BY (a).a_id) ) AS outputFROM( SELECT a, xmlagg( XMLELEMENT(name b, XMLFOREST((b).b_id AS b_id, (b).val AS val), c_xml ) ORDER BY (b).b_id) AS b_xml FROM ( SELECT a, b, xmlagg( XMLELEMENT(name c, XMLFOREST((c).c_id AS c_id, (c).blah AS blah) ) ORDER BY (c).c_id) AS c_xml FROM xmlinput GROUP BY a, b ) c_as_xml GROUP BY a) b_as_xml;
…但是实际上,您必须是某种受虐狂才能编写这样的代码。尽管可以证明它相当快。
要理解该查询,您需要阅读PostgreSQL
XML文档。奇怪的语法是SQL / XML委员会梦dream以求的,不要怪我们。
还要注意,在上面的代码中大量使用 行变量
来使其保持井井有条。a
,b
并c
作为整行传递到查询的外层。这样就避免了名称冲突时使用别名的麻烦。语法(a).a_id
等含义是“a_id
行变量的字段a
”。有关详细信息,请参见PostgreSQL手册。
上面使用了更好的XML结构(请参阅下面的注释)。如果要发出属性而不是元素,则可以将XMLFOREST
调用更改为XMLATTRIBUTES
调用。
输出:
<items><a><a_id>1</a_id><name>fred</name><b><b_id>11</b_id><val>x</val><c><c_id>1</c_id><blah>whatever</blah></c><c><c_id>2</c_id><blah>gah</blah></c></b><b><b_id>12</b_id><val>y</val><c><c_id>3</c_id><blah>borkbork</blah></c></b></a><a><a_id>2</a_id><name>bert</name><b><b_id>21</b_id><val>a</val><c/></b><b><b_id>22</b_id><val>b</val><c><c_id>4</c_id><blah>fuzz</blah></c></b></a></items>
或者,印刷精美:
<?xml version="1.0" encoding="utf-16"?><items> <a> <a_id>1</a_id> <name>fred</name> <b> <b_id>11</b_id> <val>x</val> <c> <c_id>1</c_id> <blah>whatever</blah> </c> <c> <c_id>2</c_id> <blah>gah</blah> </c> </b> <b> <b_id>12</b_id> <val>y</val> <c> <c_id>3</c_id> <blah>borkbork</blah> </c> </b> </a> <a> <a_id>2</a_id> <name>bert</name> <b> <b_id>21</b_id> <val>a</val> <c /> </b> <b> <b_id>22</b_id> <val>b</val> <c> <c_id>4</c_id> <blah>fuzz</blah> </c> </b> </a></items>
请发出更好的XML
附带说明一下,在XML中使用诸如此类的属性似乎很诱人,但是使用起来很快变得困难而丑陋。请只使用普通的XML元素:
<Table 1> <Nr>1</Nr> <Name>blah</Name> <Table 2> <Nr>1</Nr> <Table 3> <Col1>42</Col1> <Col2>...</Col2> <Col3>...</Col3> <Col4>...</Col4> ... </Table 3> </Table 2> </Table 1>
centos 7下源码编译安装php支持PostgreSQL postgresql手册 postgresql官网下载 postgresql视频教
1. 下载源码
$ mkdir /usr/downloads $ wget -c http://cn2.php.net/distributions/php-5.6.20.tar.gz $ tar -xvf php-5.6.20.tar.gz $ mv php-5.6.20 /usr/local/src $ cd !$ & cd php-5.6.20
2. 阅读安装指导
$ ls -also $ less README $ less INSTALL
3. 安装依赖包
$ yum install apr apr-util apr-devel apr-util-devel prce lynx
4. 安装httpd
$ wget -c http://apache.fayea.com//httpd/httpd-2.4.20.tar.gz $ tar -xvf httpd-2.4.20.tar.gz $ cd httpd-2.4.20 $ ./configure \ --prefix=/usr/local/programs/apache2 \ --enable-rewrite \ --enable-so \ --enable-headers \ --enable-expires \ --with-mpm=worker \ --enable-modules=most \ --enable-deflate \ --enable-module=shared $ make $ make install $ cd /usr/local/programs/apache2 $ cp bin/apachectl /etc/init.d/httpd ## 复制启动脚本 $ /etc/init.d/httpd start ## 启动apache服务器,访问http://localhost/ $ egrep -v ''^[ ]*#|^$'' /usr/local/apache2/conf/httpd.conf | nl ## 查看apache服务器的配置 ## 将apache加入系统服务 vi /etc/rc.d/rc.local ``` /usr/local/programs/apache2/bin/apachectl start ``` $ cat /etc/rc.local
4. 安装postgresql
立即学习“PHP免费学习笔记(深入)”;
$ yum install readline-devel ## 安装readline依赖 $ cd /usr/downloads $ wget -c https://ftp.postgresql.org/pub/source/v9.5.0/postgresql-9.5.0.tar.bz2 $ tar -xvf postgresql-9.5.0.tar.bz2 $ cd postgresql-9.5.0 $ ./configure --prefix=/usr/local/programs/postgresql $ make $ su $ make install $ /sbin/ldconfig /usr/local/programs/postgresql/lib ## 刷新下共享动态库 $ cd /usr/local/programs/postgresql $ bin/psql --version ## 检查运行情况 ## 开始对postgresql的配置 $ vi /etc/profile.d/postgresql.sh ## 增加环境变量,不推荐直接在/etc/profile中添加,系统更新升级时会需要merge ``` PATH=/usr/local/programs/postgresql:$PATH export PATH ``` $ source /etc/profile ## 更新环境变量 ## 增加用户和其他文件夹 $ adduser postgres $ passwd postgres $ mkdir /usr/local/programs/postgresql/logs $ mkdir /usr/local/programs/postgresql/data $ chown postgres /usr/local/programs/postgresql/data $ su - postgres ## 初始化数据库 $ ./bin/initdb -D ./data $ ./bin/createdb test $ ./bin/psql test ## 已有数据库,可导入data文件夹后尝试root访问,假如带密码,可能需要进一步研究下 $ ./bin/postgres -D ./data >./logs/start-log-1.log 2>&1 & $ ./bin/psql --list ##列出数据库 ## ok,安装完成 ## 自定义设置,权限控制等,可以跳过,等熟悉使用后再做 ## 编辑数据库配置及权限文件: $ vi /usr/local/programs/postgresql/data/postgresql.conf ## 数据库配置文件 $ chown postgres postgresql.conf $ chmod 644 postgresql.conf $ vi /usr/local/programs/postgresql/data/pg_hba.conf ## 权限文件 $ vi /usr/local/programs/postgresql/data/pg_ident.conf ## 设置开机自启动: $ vi /etc/rc.d/rc.local ## 添加如下内容 ``` /usr/local/programs/postgresql/bin/postgresql start ```
5. 安装php
## 源码已经在第一步中下载,现在开始安装: $ yum install libxml2 libxml2-devel libpng libpng-devel libjpeg libjpeg-devel freetype freetype-devel $ ./configure \ --prefix=/usr/local/programs/php \ --with-apxs2=/usr/local/programs/apache2/bin/apxs \ --with-zlib \ --with-gd \ --with-jpeg-dir \ --with-png-dir \ --with-freetype-dir \ --with-zlib-dir \ --enable-mbstring \ --with-pgsql=/usr/local/programs/postgresql \ --with-pdo-pgsql=/usr/local/programs/postgresql $ make $ make test > Bug #42718 (unsafe_raw filter not applied when configured as default filter) [ext/filter/tests/bug42718.phpt] XFAIL REASON: FILTER_UNSAFE_RAW not applied when configured as default filter, even with flags > Bug #67296 (filter_input doesn''t validate variables) [ext/filter/tests/bug49184.phpt] XFAIL REASON: See Bug #49184 > Bug #53640 (XBM images require width to be multiple of 8) [ext/gd/tests/bug53640.phpt] XFAIL REASON: Padding is not implemented yet > zend multibyte (7) [ext/mbstring/tests/zend_multibyte-07.phpt] XFAIL REASON: https://bugs.php.net/bug.php?id=66582 > zend multibyte (9) [ext/mbstring/tests/zend_multibyte-09.phpt] XFAIL REASON: https://bugs.php.net/bug.php?id=66582 >Bug #70470 (Built-in server truncates headers spanning over TCP packets) [sapi/cli/tests/bug70470.phpt] XFAIL REASON: bug is not fixed yet ## 查阅官方的bug,发现: > id=66582: status : Closed. Fixed in master (PHP7) > id=42718: status : Assigned > id=42718: reference to id=49184, unsolved for many years ## 那就不关心了,直接装吧 $ make install > You may want to add: /usr/local/programs/php/lib/php to your php.ini include_path ## 那就按它说的设置吧 $ cp php.ini-development /usr/local/programs/php/lib/php.ini ``` include_path = ".;/usr/local/programs/php/lib/php" ## 然后,编辑httpd的设置,确保其能正确解析php文件 ``` ... LoadModule php5_module modules/libphp5.so ... AddType application/x-httpd-php .php AddType application/x-httpd-php-source .php5 ... <ifmodule dir_module> DirectoryIndex index.html index.php </ifmodule> ``` ## 重启httpd,测试 $ cd /usr/local/programs/apache2 $ bin/httpd -h $ bin/httpd -k stop $ bin/httpd -f conf/httpd.conf ## 默认设置的www页面在./htdocs/下,那就先去里面建一个测试页面吧 $ vi htdocs/index.php ``` <?php phpinfo(); ?> ``` $ curl http://localhost/index.php |grep postgresql #ok
后续应该做的事
* 1. 启动时,不需要要手动指定配置文件
* 2. php初始化www目录设置
* 3. php 用户、权限管理等
以上就介绍了centos 7下源码编译安装php支持PostgreSQL,包括了postgresql,centos 7方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
linux – 从postgresql 9.3迁移到9.4,postgis
所以这就是我试图做的.首先我像这样运行旧的postgresql
/opt/pgsql-9.3/bin/pg_ctl -D /var/lib/postgres/data/ start
然后,我尝试将旧数据库转储到文件中:
/opt/pgsql-9.3/bin/pg_dumpall >> old_backup.sql
它告诉我:
pg_dump: [archiver (db)] query Failed: ERROR: Could not access file "$libdir/postgis-2.1": No such file or directory
好吧,我试图找到postgis-2.1文件并将它们复制到libdir
find / -name "*postgis-2.1*" /usr/lib/postgresql/rtpostgis-2.1.so /usr/lib/postgresql/postgis-2.1.so /usr/lib/postgresql/postgis-2.1 <-----
好的,现在什么是libdir?
/opt/pgsql-9.3/bin/pg_config --pkglibdir /opt/pgsql-9.3/lib
所以我在/opt/pgsql-9.3/lib中创建了一个符号链接到这里/usr/lib/postgresql/postgis-2.1:
pwd /opt/pgsql-9.3/lib ls -l postgis-2.1 postgis-2.1 -> /usr/share/postgresql/contrib/postgis-2.1
但我仍然得到错误:查询失败:错误:无法访问文件“$libdir / postgis-2.1”:没有这样的文件或目录
我有点想法.也许有人可以帮助我?
我是usnig arch linux
P.S
Postgis已安装:
pacman -S postgis warning: postgis-2.1.5-1 is up to date -- reinstalling
以下是二进制文件:
find / -name "*postgis-2.1*" /usr/lib/postgresql/rtpostgis-2.1.so <---- binary /usr/lib/postgresql/postgis-2.1.so <----- binary /opt/pgsql-9.3/lib/postgis-2.1 <----- that's the symlink from earlier /usr/share/postgresql/contrib/postgis-2.1
解决方法
$rm /opt/pgsql-9.3/lib/postgis-2.1 # it is a wrong link,so undo it $ln -s /usr/lib/postgresql/postgis-2.1.so /opt/pgsql-9.3/lib/
现在PostGIS .so文件将在“$libdir”中,您将能够执行pg_dumpall.
当然保持这种方式不会让我理智,但是作为你的升级,我假设这只是一个中间状态,你将完全删除Postgresql 9.3.您还必须验证PostGIS是否与9.3库链接,否则您可能会遇到一些问题.
Postgres-XL:基于PostgreSQL的开源可扩展数据库集群
Postgres-XL:基于Postgresql的开源可扩展数据库集群
With powerful performance and security enhancements for Postgresql,sophisticated management tools for global deployments and database compatibility,EnterpriseDB software supports both mission and non-mission critical enterprise applications. More than 2,500 enterprises,governments and other organizations worldwide use EnterpriseDB software,support,training and professional services to integrate open source software into their existing data infrastructures.
Based in bedford,MA,EnterpriseDB is backed by strategic private investors.“
- 开放源代码:www.postgres-xl.org
Postgres-XL 全称为 Postgres eXtensible Lattice,是TransLattice公司及其收购数据库技术公司–StormDB的产品,是StormDB核心部分重塑后开源。
开源协议使用宽松的“Mozilla Public License”许可,允许将开源代码与闭源代码混在一起使用。 - 完全的ACID支持
- 可横向扩展的关系型数据库(RDBMS)
- 支持OLAP应用,采用MPP(Massively Parallel Processing:大规模并行处理系统)架构模式
- 支持OLTP应用,读写性能可扩展 (注意,排在第一位的是OLAP!!!)
- 集群级别的ACID特性
- 多租户安全
- 也可被用作分布式Key-Value存储
- 事务处理与数据分析处理混合型数据库
- 支持丰富的sql语句类型,比如:关联子查询
- 支持绝大部分Postgresql的sql语句
- 分布式多版本并发控制(MVCC:Multi-version Concurrency Control)
- 支持JSON和XML格式
- 内建的高可用机制
- 使用外部机制实现高可能,如:Corosync/Pacemaker
- 有未来功能提升的空间
- 增加节点/重新分片数据(re-shard)的简便性
- 数据重分布(redistribution)期间会锁表
- 可采用预分片(pre-shard)方式解决,在同台物理服务器上建立多个数据节点,每个节点存储一个数据分片。
数据重分布时,将一些数据节点迁出即可
- 某些外键、唯一性约束功能
- 基于开源项目Postgres-XC
- XL增加了MPP,允许数据节点间直接通讯,交换复杂跨节点关联查询相关数据信息,减少协调器负载。
- 多个协调器(Coordinator)
- 应用程序的数据库连入点
- 分析查询语句,生成执行计划
- 多个数据节点(Datanode)
- 实际的数据存储
- 数据自动打散分布到集群中各数据节点
- 本地执行查询
- 一个查询在所有相关节点上并行查询
- 全局事务管理器(GTM:Global Transaction Manager)
- 提供事务间一致性视图
- 部署GTM Proxy实例,以提高性能
- 处理客户端网络连接,是数据库的接入点
- 分析查询语句,生成执行计划,并将计划传递给数据节点实际执行
- 对数据节点返回的查询中间结果集执行最后处理
- 管理事务两阶段提交(2PC)
- 存储全局目录(Global Catalog)信息
- 存储表和索引数据
- 只有协调器连接到数据节点
- 执行协调器下传的查询
- 两个数据节点间可建立一对一通讯连接,交换分布式表关联查询的相关信息
- 处理必须的MVCC任务
- Transaction IDs 事务ID
- Snapshots 数据快照,MVCC使用
- 管理全局性数据值
- Timestamps 时间戳
- Sequences 序列对象
- 全集群只有一个GTM节点,会有单点故障问题。解决方案:配置StranBy热备节点保证高可用
- 通过部署GTM Proxy,解决可能的GTM性能瓶颈
- 与协调器(Coordinator)和数据节点(Datanode)在一起运行
- 后端(协调器、数据节点)用它替代GTM,直接与它交互,它做为后端与GTM间的中间人
- 将对GTM的请求分组归集,多个请求一次提交给GTM
- 获取transaction ids(XIDs)范围
- 获取数据快照
- 比如: 10个进程分别请求一个transaction id
- 它们每一个都连接到本地的GTM Proxy
- GTM Proxy发送请求到GTM,一次申请10个XID
- GTM锁定procarray数据结构,分配10个XID
- GTM返回XID范围
- GTM解除进程互斥锁
CREATE TABLE my_table (…)distribute BYHASH(col) | MODULO(col) | ROUNDROBIN | REPLICATION[ TO NODE (nodename[,nodename…])]
- 益用于只读和读多写很少的表
- 有时益用于数据仓库的维度表
- 如果协调器与数据节点一对一部署在同一台服务器,就会是本地数据读取,减少网络传送
- 对写入频繁的表严重不适用
- 每行记录复制到集群中所有的数据节点,每节点一份
- 益用于写入频率的表
- 益用于数据仓库的事实表
- 每行记录只存于一个数据节点
- 可用的分片策略方式
- Hash
- Round Robin
- Modulo
- 不存在单点故障
- 全局事务管理器采用热备方式(有热备就不叫单点故障了吗?)
- 多个协调器间负载均衡
- 数据节点使用流式复制,复制数据到备节点
- 但,但是,这一切目前都是手工的........... (主要是讲流式复制?手工的,讲个毛啊~)
- 测试使用针对电子商务应用的TPC-W(DBT-1)基准测试模型。
- 协调层增加了30%的开销:在单节点(cpu4核)上,与简单地直接使用Postgresql相比,只有Postgresql性能的70%。
- 集群规模扩大到10个节点时,与单节点Postgresql相比,理论上应获得7倍性能提升,实际上达到6-6.4倍。
- 随着集群节点数的增加,打开的事务数、快照空间占用、可见性检查都会随之增长。
postgresql – Postgres pg_toast在autovacuum – 哪个表?
select query,from pg_stat_activity where query like '%autov%'; "autovacuum: VACUUM pg_toast.pg_toast_15404513 "
我如何找到什么表/索引/这pg_toast属于什么?还是自动真空工作在别的什么?
select n.nspname,c.relname from pg_class c inner join pg_namespace n on c.relnamespace = n.oid where reltoastrelid = ( select oid from pg_class where relname = 'pg_toast_15404513' and relnamespace = (SELECT n2.oid FROM pg_namespace n2 WHERE n2.nspname = 'pg_toast') )
如果Pg在真空指令摘要中报告了这一点,这将是很好的.
关于从PostgreSQL到XML的3个表的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于centos 7下源码编译安装php支持PostgreSQL postgresql手册 postgresql官网下载 postgresql视频教、linux – 从postgresql 9.3迁移到9.4,postgis、Postgres-XL:基于PostgreSQL的开源可扩展数据库集群、postgresql – Postgres pg_toast在autovacuum – 哪个表?的相关知识,请在本站寻找。
本文标签: