2013-02-17

[psql][mysql] Kilka różnic między MySql'em a PostgreSql'em

Po dłuuugiej przerwie usiadłem przed bazą MySQL'a i próbuję jakoś ją ogarnąć. Ostatnio stykam się głównie z PostgreSQL'em i nabrałem już kilka nawyków, które nie do końca się sprawdzają przy MySQL'u. Jest między tymi bazami kilka różnic w obsłudze i postaram się je w tym wpisie zbierać i przedstawić.
Odwykłem od nakładek typu phpMyAdmin - wszystkie zapytania i modyfikacje wykonuję w postgresie z konsoli i jest mi z tym dobrze. :) Spróbuję tak samo działać w MySQl'u.

Już na starcie niestety uderzył mnie w MySQL'u brak "podpowiadania" poleceń po wciśnięciu Tab - to jakaś masakra (EDIT: okazuje się że podpowiada jak się pisze dużymi literami). Nie podpowiada też ścieżki do pliku, który chciałbym na przykład wczytać...

Oto kilka różnic, które dostrzegłem po kilku chwilach:

Tworzenie nowej bazy danych


W PostgreSQL i w MySQL wygląda to tak samo:
CREATE DATABASE nazwa_bazy;

W postgresie można utowrzyć nową bazę jeszcze nie będąc w psql:
createdb -U nazwa_usera nazwa_bazy

W mysql pewnie też można ale ja tego póki co nie odkryłem... :)

Wejście do bazy danych


psql:
psql -W -U nazwa_usera nazwa_bazy

mysql:
mysql -u nazwa_usera -p -D nazwa_bazy

Wczytanie kodu SQL z pliku


psql:
$ psql -U nazwa_usera nazwa_bazy -f /var/www/projekt/sql/0001.sql

lub
\i /var/www/projekt/sql/0001.sql


mysql:
$ mysql -u nazwa_usera -p nazwa_bazy < /var/www/projekt/sql/0001.sql
lub
\. /var/www/projekt/sql/0001.sql
Wielkich różnic tutaj nie ma - oprócz wyżej wspomnianego braku podpowiadania...

Wyświetlenie baz danych

psql:
select datname from pg_database;
mysql:
show databases;

Wyświetlenie tabel bazy danych

psql:
\dt
mysql:
show tables;

Wyświetlenie szczegółów tabeli

psql:
\d nazwa_tabeli
mysql:
describe nazwa_tabeli;

Modyfikacja kolumny tabeli

psql:
ALTER TABLE t1 ALTER COLUMN test TYPE VARCHAR(255);
mysql:
ALTER TABLE t1 MODIFY test VARCHAR(255);



Jest na pewno jeszcze pół miliona więcej różnic - jak coś zauważę to dodam do listy.

2013-01-10

[psql] Wyciągnięcie id z inserta i wykorzystanie go w innym insercie

Tym razem problem SQL'owy. Miałem dziś potrzebę stworzenia zapytania, które rozpisze dane z pewnej tabeli do dwóch powiązanych ze sobą tabel. Potrzebowałem w tym celu id zapisywanej pozycji aby móc ją wykorzystać w innym insercie. Tutaj z pomocą przyszła mi możliwość utworzenia w PostgreSQL funkcji oraz triggerów. Jako pierwsze stworzyłem funkcję insert_po_insercie() za pomocą której dokonuję operacji na tej drugiej tabeli (posiadając już id):
create function insert_po_insercie()
  returns trigger
as $$
begin
  insert into table_02 (ido, idm, komentarz, idp, idupr, iddest) values ('0', '0', 'testowy komentarz', new.idp, (select id from upr where kod='ewus'), new.id);
  return new;
end;
$$ language plpgsql;
Później stworzyłem triggera insert_po_insercie, który wygląda tak:
create trigger insert_po_insercie
  after insert on table_01
for each row
execute procedure insert_po_insercie();
Widać tutaj, że po insercie do tabeli table_01 wywoływana jest funkcja insert_po_insercie(). Mając już tak funkcję i triggera można wykonać inserty do tabeli table_01:
INSERT INTO table_01 (id_operacji, data_czas_operacji, idp) SELECT id_operacji, data_czas_operacji, idp FROM guilty_table;
W funkcji przy tworzeniu inserta skorzystałem z świeżo utworzonego id (new.id) oraz przy okazji idp (new.idp), które również było mi potrzebne. Można w ten sposób pobierać dowolną kolumnę z tabeli źródłowej. Funkcja poza pokazanym na przykładzie insertem może robić wiele innych czynności. Na przykład po insercie można umieścić update do jeszcze innej tabeli, w której z kolei skorzystamy z id nowoutowrzonego inserta:
create function insert_po_insercie()
  returns trigger
as $$
begin
  insert into table_02 (ido, idm, komentarz, idp, idupr, iddest) values ('0', '0', 'testowy komentarz', new.idp, (select id from upr where kod='ewus'), new.id);
  update table_03 set idx=currval('table_02_id_seq'::regclass) where id=new.id;
  return new;
end;
$$ language plpgsql;
Całość wygląda zatem tak:
create function insert_po_insercie()
  returns trigger
as $$
begin
  insert into table_02 (ido, idm, komentarz, idp, idupr, iddest) values ('0', '0', 'testowy komentarz', new.idp, (select id from upr where kod='ewus'), new.id);
  update table_03 set idx=currval('table_02_id_seq'::regclass) where id=new.id;
  return new;
end;
$$ language plpgsql;

create trigger insert_po_insercie
  after insert on table_01
for each row
execute procedure insert_po_insercie();

INSERT INTO table_01 (id_operacji, data_czas_operacji, idp) SELECT id_operacji, data_czas_operacji, idp FROM guilty_table;
Pozdrawiam!

2012-12-22

[kohana] Zapis do logów

Kohana::$log->add(Log::WARNING, $msg);
To krótkie polecenie zapisuje nam dowolne informacje do katalogu logs - mała rzecz a cieszy. :) Oczywiście komunikaty mogą mieć różne statusy - nie tylko WARNING (np. ERROR, NOTICE, EMERGENCY itp.).

2012-10-02

[psql] Funkcja replace

Jeśli masz potrzebę zmiany ciągu znaków bezpośrednio w PostgreSQL to możesz tego dokonać przy pomocy funkcji replace. Możesz dzięki tej funkcji zamienić znaki nowej linii oraz inne znaki specjalne - wystarczy, że skorzystasz z literki E.

Dla przykładu przedstawiam funkcję zamieniającą znak nowej linii na spację:

replace(przykladowa_kolumna, E'\n','')

2012-09-24

Repozytorium git na niestandardowym porcie ssh

Może się zdarzyć że serwer, na którym znajduje się repozytorium git działa na niestandardowym porcie ssh. W takim wypadku musimy zmodyfikować standardowe sposoby sposoby łączenia się z gitem. W przypadku "klonowania" projektu wpisujemy zamiast:
git clone git@domain.com:project_name
polecenie:
git clone ssh://git@domain.com:/
Jeśli zmiana nastąpiła w momencie, w którym projekt już istnieje to musimy zmienić ustawienia znajdujące się w pliku .git/config:
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@domain.com:project_name
na:
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = ssh://git@domain.com:port/project_name
źródło: http://readystate4.com/2011/03/30/working-with-git-repos-on-non-standard-ports/

2012-07-01

Tunelem SSH do Apache'a

Załóżmy, że masz na jakimś serwerze Apache'a, którego nie chcesz wystawiać na świat a jednocześnie chcesz mieć do niego dostęp z każdego miejsca na świecie. :-) Nie chcesz otwierać na firewallu portu 80 ani żadnego innego oprócz tego, przez który logujesz się do maszyny za pomocą SSH (np. 9999). W takim przypadku z pomocą przychodzi tunelowanie - wystarczy zamiast:
ssh -p 9999 user@adres.mojego-serwera.pl
wpisać:
ssh -p 9999 user@adres.mojego-serwera.pl -L 9980:localhost:80
Po takim zabiegu wchodzimy w przeglądarkę, wpisujemy w pole adresu:
http://localhost:9980
i już jesteśmy na Apache'u serwera, który "stoi" na zamkniętym porcie 80.

2012-03-29

NetBeans IDE dla PHP

Dziś postanowiłem odpocząć od Eclipse i poszukać alternatywnego IDE dla PHP - padło na NetBeans.
Pierwsze testy przeszły bardzo pomyślnie - założenie projektu z istniejącego źródła poszło bezboleśnie, svn działa bez żadnych problemów bez konieczności kombinowania w ustawieniach. NetBeans poza obsługą MySql umożliwia również podpięcie się do bazy PostgreSQL - wystarczy jedynie podać parametry - żadnych dodatkowych "szpagatów". To dla mnie fantastyczna sprawa... :-)
Jak na razie problem miałem jedynie z zaznaczaniem bloku tekstu (Block Selection Mode), który w Eclipse dla PHP jest dostępny po wciśnięciu kombinacji klawiszy Ctrl+Shift+A. W NetBeans trzeba ściągnąć i zainstalować plugin, który umożliwia tego typu zaznaczanie tekstu. Plugin nazywa się Rectangular Edit Tools i można go znaleźć pod adresem: http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=33497

Już po chwili gotów jestem zaryzykować stwierdzenie, że NetBeans IDE w wersji 7.1.1 jest naprawdę godny uwagi... :)