Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer...
Transcript of Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer...
![Page 1: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/1.jpg)
Introduction to PostgreSQL Ilia Alshanetsky - @iliaa
1
![Page 2: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/2.jpg)
whois: Ilia Alshanetsky
✤ PHP Core Developer since 2001
✤ Release Master of 4.3, 5.1 and 5.2
✤ Author of “Guide to PHP Security”
✤ PostgreSQL user since 2007
✤ CIO @ Centah Inc.
✤ Occasional Photographer ;-)
2
![Page 3: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/3.jpg)
A special thanks to Christophe Pettus whose talk on PostgreSQL was an inspiration for this talk.
Christophe PettusPostgreSQL Experts, [email protected]
3
![Page 4: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/4.jpg)
The Meeting of Elephants
4
![Page 5: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/5.jpg)
SELECT * FROM PostgreSQL;
✤ Relational Database Management System
✤ Open Source answer to Oracle, Microsoft SQL Server, etc…
✤ Data integrity & reliability is #1 priority
✤ Free as in Beer (BSD/MIT license)
✤ It works well, and I like it! ;-)
5
![Page 6: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/6.jpg)
A Dash of History
✤ Created by Michael Stonebraker at UC Berkley in 1986
✤ Developed in secret until 1995
✤ Becomes an Open Source project in late 1995, as PostgreSQL v6.0
✤ Rapidly evolving & improving ever since
✤ Latest stable release is 9.1.3 (use it!)
6
![Page 7: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/7.jpg)
It runs on?
✤ All Unixy system types
✤ All flavours of Linux, BSDs, OSX, Solaris, etc…
✤ Windows since v8.0 (2005)
✤ Does not run on your Blackberry
✤ But runs on Android since 2010 ;-)
7
![Page 8: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/8.jpg)
IN ( PostgreSQL )
✤ More features than you can shake a stick at!
✤ You can read the entire, long & boring list at http://www.postgresql.org/about/featurematrix/
✤ Highly Performant, even on complex queries
✤ Extremely stable
✤ Secure (2 critical security bugs in last 5 years)
8
![Page 9: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/9.jpg)
Auto-Increment via Sequences
PostgreSQL does not have AUTO_INCREMENT, but no worries, it has something even better!
SEQUENCES!
9
![Page 10: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/10.jpg)
CREATE TABLE users ( id serial, name varchar(50),
primary key(id));
postgres=# NOTICE: CREATE TABLE will create implicit sequence "users_id_seq" for serial column "users.id"
postgres=# \d users
Table "public.users" Column | Type | Modifiers-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐ id | integer | not null default nextval('users_id_seq'::regclass) name | character varying(50) |
10
![Page 11: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/11.jpg)
select setval('users_id_seq', 10); setval -‐-‐-‐-‐-‐-‐-‐-‐-‐ 10
select nextval('users_id_seq'); nextval -‐-‐-‐-‐-‐-‐-‐-‐-‐ 11
select currval('users_id_seq'); currval-‐-‐-‐-‐-‐-‐-‐-‐-‐ 11
11
![Page 12: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/12.jpg)
CREATE SEQUENCE recounter INCREMENT BY 2 MAXVALUE 10 START WITH 6 CYCLE;
SELECT nextval('recounter'); >> 6SELECT nextval('recounter'); >> 8SELECT nextval('recounter'); >> 10SELECT nextval('recounter'); >> 1
12
![Page 13: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/13.jpg)
Data integrity for the WIN
13
![Page 14: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/14.jpg)
Integrity checks with Constraints
CREATE TABLE products ( id serial, name text, price numeric CHECK (price > 0),
primary key(id));
14
![Page 15: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/15.jpg)
Go beyond the basic validation
CREATE TABLE products ( id serial, name text, price numeric CHECK (price > 0), discount numeric CONSTRAINT discount_check CHECK (discount < 0), CHECK (-‐discount < price), primary key(id));
15
![Page 16: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/16.jpg)
Be the master of your DOMAIN
CREATE DOMAIN email_t AS varchar(255)
CONSTRAINT email_validation
CHECK (VALUE ~ ('^[_a-‐zA-‐Z0-‐9-‐]+' ||E'(\\.[_a-‐zA-‐Z0-‐9-‐]+)*@[a-‐zA-‐Z0-‐9-‐]+' || E'(\\.[a-‐zA-‐Z0-‐9-‐]+)*\\.' ||'(([0-‐9]{1,3})|([a-‐zA-‐Z]{2,3})' ||'|(aero|coop|info|museum|name))$')
);
CREATE TABLE users ( … email email_t …);16
![Page 17: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/17.jpg)
CREATE TABLE shopping_cart_items ( product_id integer, cart_id integer, user_id integer,
FOREIGN KEY (product_id) REFERENCES products(id), FOREIGN KEY (cart_id, user_id) REFERENCES shopping_cart(id, user_id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE RESTRICT, ON UPDATE CASCADE);
Oh yes, there are Foreign Keys too
17
![Page 18: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/18.jpg)
Not your grandfather’s transactions
18
![Page 19: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/19.jpg)
Transactional Schema Changes
BEGIN;
CREATE TABLE foo (id integer);INSERT INTO foo (id) values(1);
ROLLBACK;
select * from foo;
ERROR: relation "foo" does not exist
19
![Page 20: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/20.jpg)
Unsure about something? Use Savepoints!
BEGIN;
UPDATE wallet SET money = money -‐ 100 WHERE user = ‘bob’;
SAVEPOINT bobs_wallet;
UPDATE wallet SET money = money + 10 WHERE user = ‘bob’;
ROLLBACK TO bobs_wallet;
COMMIT;20
![Page 21: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/21.jpg)
Multi-Version Concurrency Control
✤ Uses versioning & snapshots to isolate concurrent queries & update operations.
✤ Queries see the state of the database at the start of the query or transaction.
✤ READ COMMITTED (default) or SERIALIZABLE isolation levels
21
![Page 22: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/22.jpg)
MVCC in Plain English
✤ Reads don’t block writes
✤ Writes rarely block reads
✤ Writes don’t affect other writes unless both are writing the same data.
22
![Page 23: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/23.jpg)
And?
✤ Lot’s of concurrent clients are supported easily
✤ Very little locking happens in most applications
✤ Transactions are cheap(er)
23
![Page 24: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/24.jpg)
Data Storage
PostgreSQL provides many different data types for managing your data beyond the basic Numeric, Text and Date types.
24
![Page 25: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/25.jpg)
Date & Time Interval
SELECT '2012-‐01-‐12'::date -‐ '1 year 2 mons 10 days 5 hours'::interval;
2010-‐11-‐01 19:00:00
create table foo (bar interval);insert into foo values('11:55:06'::time -‐ '05:22:15'::time); select * from foo;
06:32:51
25
![Page 26: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/26.jpg)
Network
SELECT '192.168.1.2'::inet;
192.168.1.2
SELECT '08002b010203'::macaddr;
08:00:2b:01:02:03
SELECT '192.168'::cidr + 300;
SELECT '192.168'::cidr;
192.168.0.0/24
192.168.1.44/24
26
![Page 27: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/27.jpg)
Arrays
CREATE TABLE sample ( int_list integer[], char_box varchar[3][3]);
INSERT INTO sample (int_list, char_box) VALUES( '{1,2,3,4,5}', '{{a,b,c},{x,y,z},{1,2,3}}');
int_list | char_box -‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐ {1,2,3,4,5} | {{a,b,c},{x,y,z},{1,2,3}}
27
![Page 28: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/28.jpg)
Geometric
Point (x,y)Line ((x1,y1),(x2,y2))
Box ((x1,y1),(x2,y2))
Circle ((x1,y1),r)
Path ((x1,y1),...)
28
![Page 29: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/29.jpg)
Composite Types
CREATE TYPE pair AS ( x integer, y numeric);
CREATE TABLE foo ( id int, bar pair );
INSERT INTO foo VALUES (1, ROW(1, 5.4));
SELECT * FROM foo;
SELECT (bar).x from foo;
id | bar -‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐ 1 | (1,5.4)
x -‐-‐-‐ 1
29
![Page 30: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/30.jpg)
XML Data Types
CREATE TABLE ExMel ( data xml );
INSERT INTO ExMel VALUES
('foo<bar>Baz</bar>'::xml),
(XMLPARSE (CONTENT 'foo<bar>Baz</bar>')),
(XMLPARSE (DOCUMENT '<?xml version="1.0"?><eof/>')); data -‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐ foo<bar>Baz</bar> foo<bar>Baz</bar> <eof/>
30
![Page 31: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/31.jpg)
And Many Others...
✤ UUID
✤ ENUM
✤ BIT
✤ Fulltext (ts_vector & ts_query)
✤ Boolean
✤ Bit
✤ Money
✤ ByteA
31
![Page 32: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/32.jpg)
When PostgreSQL install you must, code
compile you shall!
32
![Page 33: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/33.jpg)
200+ config options you will find,
But, panic you will not.
33
![Page 34: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/34.jpg)
✤ shared_buffers - ideally 25% of total memory
✤ work_mem - 2-10 MB depending on your work-load
✤ maintenance_work_mem - 256 MB for most work-loads
For the rest PostgreSQL will rely on OS disk caching
Memory Management
34
![Page 35: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/35.jpg)
Risk VS Speed
✤ syncronous_commit - If turned off, don’t wait for WAL data to be synced to disk
✤ wal_buffers - 1MB for most installs is plenty
✤ checkpoint_segments - 10 in most cases (every 160MB)
✤ fsync - If turned off, don’t sync data to disk (scary!)
35
![Page 36: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/36.jpg)
✤ max_connections - Anything over 300 is case for concern
✤ random_page_cost - 2 on fast disks, < 1 on SSDs
✤ default_statistics_target - 1,000 is a good value in most cases
Other Performance Settings
36
![Page 37: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/37.jpg)
✤PDO::PGSQL ✤PgSQL
PHP & PostgreSQL
37
![Page 38: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/38.jpg)
Making the Connection
$db = new PDO("pgsql: dbname=postgres host=localhost" ,"postgres" ,""
);
$db = new PDO("pgsql: dbname=postgres host=localhost" . " user=postgres password=");
38
![Page 39: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/39.jpg)
Query Execution
$db = new PDO("pgsql: ...");
// create table users // (id serial, login text, passwd text);
$db-‐>exec("INSERT INTO users (login, passwd) VALUES('login', 'pwd')");
$db-‐>lastInsertId('users_id_seq');
39
![Page 40: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/40.jpg)
RETURNING Magic
$db-‐>query("INSERT INTO users (login, passwd) VALUES('login', 'pwd') RETURNING id")-‐>fetchColumn(); // Get record ID
$db-‐>query("INSERT INTO users (login, passwd) VALUES('login', 'pwd') RETURNING *")-‐>fetch(PDO::FETCH_ASSOC); // Get entire record
40
![Page 41: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/41.jpg)
Accumulator
$db-‐>query("SELECT array_agg(login) FROM (SELECT login FROM users ORDER BY id DESC) q")-‐>fetchColumn(); // {bob,mike,jane}
$db-‐>query(" SELECT array_to_string(array_agg(login), '<br/>') FROM (SELECT login FROM users ORDER BY id DESC) q")-‐>fetchColumn(); // bob<br/>mike<br/>jane
41
![Page 42: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/42.jpg)
Playing it Safe
42
![Page 43: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/43.jpg)
pg_dump \
-‐U postgres \ -‐h localhost \ -‐F c \ -‐C \ -‐Z 6 \ dbname
Snapshots
# login
# hostname
# internal format
# create database
# compress
43
![Page 44: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/44.jpg)
✤ Very Simple to Configure
✤ Allows for a point-in-time data recovery
✤ On the downside it is not
✤ real-time
✤ does not offer automatic fail-over
WAL Log Shipping Replication
44
![Page 45: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/45.jpg)
✤ Very simple to setup as of v9.0
✤ Real-time
✤ Allows fail-over
✤ Master-to-slave SELECT query offloading
Streaming Replication
45
![Page 46: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/46.jpg)
What about prior releases?
✤Slony-I✤PGPool II
46
![Page 47: Introduction to PostgreSQL - Ilia · 2012-02-29 · whois: Ilia Alshanetsky PHP Core Developer since 2001 Release Master of 4.3, 5.1 and 5.2 Author of “Guide to PHP Security”](https://reader033.fdocuments.us/reader033/viewer/2022043012/5fa9041aa33e093ad8102aa4/html5/thumbnails/47.jpg)
✤ pgAdmin✤ phpPGAdmin✤ psql console (it is awesome!)✤ pgFouine
Helpful Tools
47