PostgreSQL ismertető
1.
Bevezető
PostgreSQL bevezető
Ha több fejlesztő beszélget a különböző adatbázis megoldások használatáról
általában kettő kerül szóba. Az egyik a MySQL, és a másik - amit ez a
dokumentum mutat be a PostgreSQL. Ez egy örökös vita és már régóta tart
de akárhogyan is van a PostgreSQL sokkal közelebb áll az eredeti relációs
adatbázis elképzelésekhez. Az IDEGEN KULCSOK (FOREIGN KEYS) csak a
MYSQL 5-ös verziójába kerültek bele. Akárhogyan is áll a dolog ez a dokumentum
feltételezi, hogy te a PostgreSQL adatbázist akarod használni. Amivel kezdünk
az a telepítés az emerge-vel. Az ezt követő részben az alap beállítás
kerül bemutatásra az emerge segítségével.
PostgreSQL telepítése
Legelső lépésként az emerge paranccsal fel kell telepíteni a PostgreSQL
csomagot. Futtasd le a következő kódrészletet, hogy megbizonyosodj a
beállításokról:
Kódlista 1.1: Checking the PostgreSQL build options |
# emerge -pv postgresql
These are the packages that I would merge, in order:
Calculating dependencies ...done!
[ebuild N ] dev-db/postgresql-8.0.4 -doc -kerberos +nls +pam +perl -pg-intdatetime +python +readline (-selinux) +ssl -tcl +xml +zlib 0 kB
|
Itt található, hogy melyik beállítás mit jelent:
| USE Flag |
Értelmezés |
| doc |
Ez a USE flag be- vagy kikapcsolásával a telepített állomány
tartalmazni fog dokumentációt a man oldalakon kívül is. Akkor érdemes
kikapcsolni ha kevés hellyel rendelkezel vagy egyéb módon (online, stb.)
el tudod érni a dokumentációt.
|
| kerberos |
Ha ez az opció be van kapcsolva, akkor az adminisztrátor
kerberos megoldást használhat az adatbázishoz csatlakozó
felhasználók és egyéb szolgáltatások ellenőrzésére
(autentikálására).
|
| nls |
Ha ez az opció be van kapcsolva, akkor a PostgreSQL a nem angol
anyanyelvű felhasználóknak szóló rendszerüzeneteket használja.
|
| pam |
Ha ez az opció be van kapcsolva, és a konfigurációs fájlok a megfelelő
beállításokat tartalmazzák, akkor a felhasználók/szolgáltatások
PAM felhasználásával képesek csatlakozni és belépni.
|
| perl |
Ha ez az opció be van kapcsolva, akkor a PostgreSQL perl
kötésekkel (bindings) kerül telepítésre.
|
| pg-intdatetime |
Ha ez az opció be van kapcsolva, akkor a PostgreSQL támogatja a 64 bites
integer dátum típusokat.
|
| python |
Ha ez az opció be van kapcsolva, akkor a PostgreSQL python
kötésekkel (bindings) kerül telepítésre.
|
| readline |
Ha ez az opció be van kapcsolva, akkor a PostgreSQL támogatja a
readline stílusú parancssori műveleteket. Ez magában foglalja
a régebbi parancsok tárolását és az isearch funkciókat.
|
| selinux |
Ha ez az opció be van kapcsolva, akkor a selinux szabályrendszer
érvényesül.
|
| ssl |
Ha ez az opció be van kapcsolva, akkor a PostgreSQL az OpenSSL
könyvtárakat (lib) használja a szerver és a kliens közti forgalom
titkosítására.
|
| tcl |
Ha ez az opció be van kapcsolva, akkor a PostgreSQL tcl
kötésekkel (bindings) kerül telepítésre.
|
| xml |
Ha ez az opció be van kapcsolva, akkor a telepített programban
szerepel XPATH támogatás. Erről és a PostgreSQL xml
támogatásáról további információkat itt találsz:
PostgreSQL és XML.
|
| zlib |
Ezt igazából nem a PostgreSQL használja, hanem a pg_dump, hogy
képes legyen tömöríteni kiírás(dump) során.
|
Elsőként be kell állítani a PostgreSQL-t az igényeid szerint. Kezd az
emerge paranccsal:
Kódlista 1.2: A PostgreSQL emerge-lése |
# emerge postgresql
>>> /usr/lib/libecpg.so.5 -> libecpg.so.5.0
>>> /usr/bin/postmaster -> postgres
* Make sure the postgres user in /etc/passwd has an account setup with /bin/bash as the shell
*
* Execute the following command
* emerge --config =postgresql-8.0.4
* to setup the initial database environment.
*
>>> Regenerating /etc/ld.so.cache...
>>> dev-db/postgresql-8.0.4 merged.
|
A következő részben kerül bemutatásra a PostgreSQL beállítása.
2.
PostgreSQL beállítása
A kezdeti(alap) adatbázis környezet beállítása
Korábban már láthattad az emerge kimenetét ahol azt írta, hogy az
alap környezetet létre kell hozni és be kell állítani. Az ebuild
fájl létrehoz egy postgres felhasználót a rendszeren akinek nincsen
jelszava. Szóval mielőtt elkezdjük, a jelszót a postgres
felhasználónak meg kell adni:
Kódlista 2.1: A jelszó beállítása |
# passwd postgres
New UNIX password:
Retype new UNIX password:
passwd: password updated successfully
|
Most jön az alap környezet beállítása:
Kódlista 2.2: Az adatbázis környezet beállítása emerge --config paranccsal |
# emerge --config =postgresql-8.0.4
Configuring pkg...
* Creating the data directory ...
* Initializing the database ...
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale C.
fixing permissions on existing directory /var/lib/postgresql/data ... ok
creating directory /var/lib/postgresql/data/global ... ok
creating directory /var/lib/postgresql/data/pg_xlog ... ok
creating directory /var/lib/postgresql/data/pg_xlog/archive_status ... ok
creating directory /var/lib/postgresql/data/pg_clog ... ok
creating directory /var/lib/postgresql/data/pg_subtrans ... ok
creating directory /var/lib/postgresql/data/base ... ok
creating directory /var/lib/postgresql/data/base/1 ... ok
creating directory /var/lib/postgresql/data/pg_tblspc ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 1000
creating configuration files ... ok
creating template1 database in /var/lib/postgresql/data/base/1 ... ok
initializing pg_shadow ... ok
enabling unlimited row size for system tables ... ok
initializing pg_depend ... ok
creating system views ... ok
loading pg_description ... ok
creating conversions ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.
Success. You can now start the database server using:
/usr/bin/postmaster -D /var/lib/postgresql/data
or
/usr/bin/pg_ctl -D /var/lib/postgresql/data -l logfile start
*
* You can use /etc/init.d/postgresql script to run PostgreSQL instead of pg_ctl.
*
|
Az alap adatbázis környezet létrehozása megtörtént. A következő részben
megnézzük a telepítés ellenőrzését és hogy miképpen állíthatunk be új
felhasználói hozzáféréseket.
PostgreSQL adatbázis beállítása
Most, hogy a PostgreSQL adatbázis beállítása megtörtént érdemes ellenőrizni.
Elsőként bizonyosodjunk meg arról, hogy a szolgáltatás (service) rendben
elindul:
Kódlista 2.3: A PostgreSQL indítása |
# /etc/init.d/postgresql start
* Starting PostgreSQL ... [ ok ]
|
Ha rendben működik, akkor egy jó gondolat, hogy az alapértelmezett futási
szinthez adjuk hozzá:
Kódlista 2.4: A default futási szinthez hozzáadás |
# rc-update add postgresql default
* postgresql added to runlevel default
|
Ha rendben megy, akkor itt az ideje, hogy kipróbáljunk egy teszt adatbázist.
Kezdésként hozzunk létre egy test adatbázist és ehhez használjuk a
createdb parancsot. A -U kapcsolóval megadható, hogy melyik
felhasználóval csatlakozom (ha nem adsz meg semmit, akkor az aktuális
felhasználó lesz), és a -W kapcsoló pedig a kérni fogja a jelszót.
Végezetül add meg a létrehozni kívánt adatbázis nevét:
Kódlista 2.5: Adatbázis létrehozása createdb paranccsal |
$ createdb -U postgres -W test
Password:
CREATE DATABASE
|
Az adatbázis sikeresen elkészült akkor ezután képes különböző feladatok
elvégzésére. Menjünk tovább előre és dobjuk(töröljük) el ezt az adatbázist a
dropdb paranccsal:
Kódlista 2.6: Adatbázis törlése dropdb pranccsal |
$ dropdb -U postgres -W test
Password:
DROP DATABASE
|
Nos, csak a postgres felhasználó tud parancsokat futtatni. Nyilvánvaló, hogy a
beállításnak ez a módja nem jó mert mi egy többfelhasználós környezetet
szeretnénk. A következő bekezdés megmutatja hogyan lehet dolgozni felhasználói
hozzáférésekkel.
Az adatbázis beállítása felhasználói hozzáférésekkel
Mint azt korábban említettük csak, mint postgres felhasználó tudunk belépni és
ez nem kívánatos egy többfelhasználós környezetben. A legtöbb esetben
különböző felhasználók és szolgáltatások férnek hozzá a szerverhez, és
mindegyikük különböző jogosultságokkal rendelkezik. Nos, ezen segít a
createuser parancs. Ez a parancs egy nagymértékben rugalmassá teszi az
adminisztrációt. Az alábbiakban csinálunk két felhasználót, egy 'superuser' -t
aki felvehet felhasználókat, és adminisztrátora az adatbázisnak, majd egy alap
felhasználót:
Kódlista 2.7: Superuser létrehozása |
$ createuser -a -d -P -E -U postgres -W gergely
Enter password for new user:
Enter it again:
Password:
CREATE USER
|
Most egy superusert hoztunk létre. A parancs opcióiban lévő -a adja
meg, hogy az újonnan létrejövő felhasználó hozhat létre új felhasználókat. A
-d kapcsoló adja meg, hogy létrehozhat adatbázisokat. A -P
hatására meg kell adni a jelszót, a -E titkosítja a megadott jelszót.
Akkor most próbáljuk ki az új felhasználó jogosultságait.
Kódlista 2.8: Általános felhasználó létrehozása |
$ createuser -A -D -P -E -U gergely -W andras
Enter password for new user:
Enter it again:
Password:
CREATE USER
|
Siker! Az új felhasználót a fentiekben létrehozott superuser hozta létre.
A -A és -D parancssori kapcsolók szemben a -a és
-d opciókkal megtiltják, hogy az új felhasználó létrehozzon
új felhasználókat vagy új adatbázisokat. Akkor most ezek a felhasználók
készen állnak a munkára, a következő részben új adatbázissal
foglalkozunk
3.
PostgreSQL használata
Jogosultságok beállítása
Nos van egy felhasználó, aki létrehozhat adatbázisokat és más felhasználókat,
és az alap postgres felhasználó, aki bármit megtehet. A felhasználó aki
korábban létrejött jelenleg be tud lépni az adatbázis szerverre, és ennyi.
Általában a felhasználóknak szükségük van arra, hogy adatokat szúrjanak be
(insert), javítsák, módosítsák azokat, és időnként más feladataik is
akadhatnak. Szóval ennek a felhasználónak meg kell adni egy s mást, hogy
majdnem bármit megtehessen, azaz kell állítani a megfelelő jogosultságokat. Ez
könnyen megtehető a createdb parancs -O kapcsolójának
megadásával. Elkezdjük létrehozni az új adatbázist - aminek a neve
sajatDB lesz, a superuserrel és az előző teszt felhasználó (nem a
superuser) lesz a gazdája:
Kódlista 3.1: A sajatDB létrehozása |
$ createdb -O andras -U gergely -W sajatDB
Password:
CREATE DATABASE
|
Nos, van egy sajatDB nevű adatbázisunk amihez a teszt felhasználó hozzáférhet.
Tesztelésképpen lépjünk be az andras felhasználóval a sajatDB adatbázisba. Ezt
a psql programmal tehetjük meg. Ez az a program amit arra használunk,
hogy parancssoron keresztül csatlakozzunk a PostgreSQL adatbázishoz. Szóval
csatlakozzunk valahogy így:
Kódlista 3.2: Belépés a sajatDB adatbázisba a teszt-felhasználóval |
$ psql -U andras -W sajatDB
Password:
Welcome to psql 8.0.4, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
sajatDB=>
|
A teszt-felhasználó belépett az adatbázisba és elkezdhet használni különböző
parancsokat. Azért, hogy megmutassuk a PostgreSQL használatának ízét a
következő részben megnézünk néhány alap parancsot amelyekkel a psql
kliensen keresztül használhatunk.
Alap PostgreSQL parancsok és egy tábla létrehozása
Kezdetnek itt van egy lista arról a pár parancsról amiket meg fogunk mutatni.
| Parancs |
Használat |
MySQL azonosság |
| \c[onnect] [DBNAME|- [USER]] |
Kapcsolódás másik adatbázissal |
USE DATABASE |
| \q |
Kilépés a psql kliens programból |
quit |
| \i FILE |
Parancsok vagy parancsfájl futtatása FILE
|
source FILE |
| \o [FILE] |
A lekérés(query) eredményének FILE-ba irányítása |
INTO OUTFILE, de minden kimenet a fájlba kerül
(nem csak a SELECT parancsé) |
| \d [NAME] |
Adatbázis vagy tábla szerkezetének megtekintése
(más funkciókra is alkalmas) |
DESC(RIBE) |
| \db [PATTERN] |
A PATTERN mintára illeszkedő táblanevek listázása
(ha nincsen minta megadva, akkor mindent kilistáz) |
SHOW TABLES |
A \c[onnect] parancs kivételével mindegyik használatát be fogjuk
mutatni a későbbiek során. Akkor most az adatbázis üres. Be kell szúrni
(INSERT) valamennyi adatot. Az adatbevitel első lépése tulajdonképpen a tábla
létrehozása. De most nincsenek táblák az adatbázisban, szóval csinálnunk kell
egyet. Ezt megtehetjük a CREATE TABLE paranccsal. Meg kell határozni a
tábla elemeit. Ez tartalmazza a Product ID, Description, és price oszlopokat:
Kódlista 3.3: A products tábla létrehozása |
sajatDB=> CREATE TABLE products (
sajatDB(> product_id SERIAL,
sajatDB(> description TEXT,
sajatDB(> price DECIMAL
sajatDB(> );
NOTICE: CREATE TABLE will create implicit sequence "products_product_id_seq"
for serial column "products.product_id"
CREATE TABLE
|
Nyugodtan hagyd figyelmen kívül a NOTICE részt. Teljesen ártalmatlan.
Nézd meg a funkció utolsó sorát: a CREATE TABLE jelzi ha a parancs
sikeresen végrehajtásra került. Akkor most haladjunk előre és nézzük
meg a \d paranccsal, hogy mit is csináltunk:
Kódlista 3.4: Az újonnan létrehozott tábla |
sajatDB=> \d products
Table "public.products"
Column | Type | Modifiers
-------------+---------+------------------------------------------------------------------
product_id | integer | not null default nextval('public.products_product_id_seq'::text)
description | text |
price | numeric |
|
A tábla valóban létrejött. Most, hogy készen van tegyünk bele adatot.
A következő szakaszban ezt fogjuk megmutatni.
Adatok bevitele (INSERT) az adatbázisba
Ebben a részben két lehetőségét mutatom meg az adatbázis adatokkal való
feltöltésének. Elsőként nézzük meg az INSERT parancsot:
Kódlista 3.5: INSERT szintaxis |
INSERT INTO [tablename] (column1,column2,column3) VALUES(value1,value2,value3)
|
tablename tartalmazza a tábla nevét amibe az adatok belekerülnek.
(column1,column2,column3) elemekkel adhatod meg, hogy melyik oszlopba
kerüljenek adatok. Fontos, hogy a VALUES részben is ebben a sorrendben
legyenek megadva az oszlopnevek. VALUES(value1,value2,value3) a bevitelre
kerülő értékek listája. Ismételten: a values rész sorrendjének ugyanannak kell
lennie, mint a columns résznek mert: column1-be kerül a value1, column2 -be
kerül a value2, stb. A két sorrendnek egyformának kell lennie. Akkor
most rakjunk (insert) adatokat az adatbázisba:
Fontos:
Régóta dolgozom adatbázisokkal. A személyes javaslatom, hogy a fentiek
szerint legyenek meghatározva az INSERT részei. A fejlesztők gyakran
hibáznak amiatt, hogy az INSERT INTO részben nem adják meg az oszlopok
nevét. Szerintem ez a felfogás nem hatékony, ha új oszlopot adsz az
adatbázishoz, és hibát fog okozni, ha a value részben nem a megfelelő helyen
szerepel az érték. Javaslom, hogy még akkor is határozd meg az oszlopneveket,
hogy ha 300%-ig biztos vagy abban, hogy nem fogsz új oszlopokat hozzáadni.
|
Kódlista 3.6: Adatok bevitele a táblába |
sajatDB=> INSERT INTO products (description,price)
VALUES('A test product', 12.00);
INSERT 17273 1
|
Az utolsó sort meg kell magyaráznom. Az insert parancs visszaad egy OID-t
(Objektum Azonosító) és a bevitelre került sorok számát. Az OID ezen
dokumentum hatókörén kívül esik. De itt olvashatsz róla:
PostgreSQL manual A szituáció a következő: van 20,000 terméked és ennyi
adatnak a bevitele a fenti insertekkel kissé unalmas és fárasztó. De nincsen
semmi elveszve. A COPY paranccsal is lehet adatokat bevinni a táblába
stdin-en keresztül, fájlból. A példának megfelelően feltételezzük, hogy csv
(comma separated values, vesszővel elválasztott értékek) fájlban vannak
adataid, és ez a fájl így néz ki tartalmilag:
Kódlista 3.7: products.csv |
2,meat,6.79
3,soup,0.69
4,soda,1.79
|
Most használjuk a COPY parancsot adatok bevitelére:
Fontos:
A COPY FROM STDIN parancsot csak a postgres felhasználó használhatja.
Ennek biztonsági okai vannak.
|
Kódlista 3.8: COPY használata adatok bevitelére |
sajatDB=> COPY products FROM STDIN WITH DELIMITER AS ',';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 2,meat,6.79
>> 3,soup,0.69
>> 4,soda,1.79
>> \.
|
Szerencsétlenségünkre ez a megoldás nem ad vissza semmi információt az adatok
beviteléről, mint azt az INSERT INTO teszi. Honnan tudjuk, hogy az
adatok bevitelre kerültek? A következő részben megnézzük hogyan tudunk
lekérdezéseket megírni, és futtatni az adatokon, hogy ellenőrizzük a bevitt
adatokat.
PostgreSQL lekérdezések
Ebben a részben megnézzük a SELECT használatát, hogy adatokat kérjünk
le a táblából. A SELECT így néz ki:
Kódlista 3.9: SELECT utasítás |
SELECT (column1,column2|*) FROM (table) [WHERE (conditionals)]
|
Két lehetőség van: az első a *, hogy minden adatot, oszlopot
lekérdezzünk. A második, hogy megadjuk mely oszlopokat akarjuk lekérni. A
második lehetőség egy jó megoldás arra, hogy csak a kiválaszott oszlop adatait
lásd. Elsőként a SELECT -t használjuk a *-al, hogy minden
oszlop megjelenjen:
Kódlista 3.10: A products tábla |
sajatDB=> SELECT * FROM products;
product_id | description | price
------------+----------------+-------
1 | A test product | 12.00
2 | meat | 6.79
3 | soup | 0.69
4 | soda | 1.79
(4 rows)
|
Ami itt látható az az összes adat a táblában amit korábban felvittünk. Most
pedig csak a description és a price oszlopokat akarom látni, a product id nem
érdekel. Ebben az esetben meg kell adni, hogy melyik táblákat akarom
lekérdezni:
Kódlista 3.11: Megadott oszlopok megtekintése a products táblában |
sajatDB=> SELECT description,price FROM products;
description | price
----------------+-------
A test product | 12.00
meat | 6.79
soup | 0.69
soda | 1.79
(4 rows)
|
Most a product és a price oszlopok tartalma látható, így csak a számomra
fontos adatokra koncentrálhatok. Akkor most nézzük meg, hogy hogyan nézhetjük
meg a $2.00 -nál nagyobb értékű termékeket. Itt használjuk a WHERE
klauzulát ilyen módon:
Kódlista 3.12: Feltételnek megfelelő sorok lekérdezése |
sajatDB=> SELECT description,price FROM products WHERE price > 2.00;
description | price
----------------+-------
A test product | 12.00
meat | 6.79
(2 rows)
|
Most csak a $2.00 -nál drágább termékek jelennek meg. Így sokkal jobban
koncentrálhatunk a fontos adatokra. A lekérdezések ilyen módon való használata
nagyon hatékony módja az adatok kezelésének. Ilyen módon nagyon extrém
reportok készíthetőek.
Befejezés
Ez volt a PostgreSQL ismertető. Egy nagy köszönet illeti Masatomo Nakanot,
az előző Gentoo PostgreSQL karbantartónak a sok segítségéért. Bármilyen
javaslatod van ezzel az ismertetővel kapcsolatban, azt a
Chris White címre küldheted. További bővebb
információkat találsz PostgreSQL
weboldalán.
Ez a dokumentum a Creative Commons -
Attribution / Share Alike licensz védelme alatt áll.
|