WebCie Databases

From A-Eskwiki
Revision as of 15:03, 18 January 2018 by Timb (Talk | contribs)

Jump to: navigation, search

De WebCie runt een paar databases waarin alle websitedata (dus ook ledendata, en transactiedata) staat. Op de vm-www, vm-www-debug en de vm-www-inwerking draaien allemaal een databaseserver en dezelfde databasestructuur (modulo updatevolgorde).

Gebruik in de code

De beste manier om kwerries op de databaas te doen is met QueryBuilder. Dit is een manier om volautomatisch SQL te genereren vanuit object-georienteerde code, zonder dat je bang hoeft te zijn voor injectie enzo.

De belangrijkste database is whoswho4, waar alle WhosWho4-objecten in staan. Dan zijn er nog benamite voor Benamite en boeken voor Bookweb.

Hoe een db-connectie opgezet wordt

In principe zouden dingen als databaseconnectie enzo al geregeld moeten zijn als je controllerfunctie aangeroepen wordt, maak hier dus alleen zorgen over als je ergens in space bezig bent.

Eerst wordt door space het bestand secret.php geladen, waarin gebruikersnaam en wachtwoord voor alle databaseusers staan. Op basis van de functie getLevel worden drie globalen $WSW4DB, $BWDB en $BMDB gemaakt door middel van dbpdo. Hun memberfunctie q(...) verstuurt een kwerrie naar de desbetreffende databaas.

Dit zorgt er ook voor dat inloggen en uitloggen (en eigenlijk alles wat de auth van de gebruiker aanpast) een refresh vereist voordat alles goed weergegeven kan worden!

Debugdatabase

Op de vm-www-debug wordt elke nacht een kopietje gemaakt van de livedatabases om op te kunnen debuggen. Deze db's heten test_$BLA waar $BLA staat voor de naam van de originele database.

Aanpassen buiten de code om

Heb je een nieuwe klasse gemaakt of een nieuw veld? Dan kun je op [1] (of als je echt PHPMyAdmin nodig hebt [2]) (debugdb) en [3] (livedb) inloggen op localhost met gebruikersnaam root en het databasewachtwoord. Dit wachtwoord vind je in het bestand .my.cnf in de homedir van gebruiker webcie. Als je klaar bent met dit soort wijzigingen, moet je de Databasestructuur committen.

Migratie naar PostgreSQL

MySQL is stiekem best wel slecht, dus we willen graag in plaats daarvan PostgreSQL gebruiken. De migratie gaat ongeveer als volgt.

SSH naar de VM waar de oorspronkelijke database opstaat. Dan doe je ongeveer de volgende stappen (dit is voor de vm-www-debug). Eerst installeren we Postgres:

wget https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-centos96-9.6-3.noarch.rpm
rpm -Uvh pgdg-centos96-9.6-3.noarch.rpm
sudo yum update                                                                
sudo yum install postgresql96-server postgresql96-contrib                      
sudo service postgresql-9.6 initdb                                             
sudo service postgresql-9.6 start                                              
sudo chkconfig postgresql-9.6 on                                               
sudo -i                                                                        
su postgres                                                                    
psql

Doe nu CREATE USER voor alle users in je secret.php.

Dan zijn we klaar om de koppeling met PHP te maken:

sudo yum install php-pgsql                                                        
sudo service httpd restart

Pas /var/lib/pgsql/9.6/data/pg_hba.conf aan zodat je auth method md5 gebruikt. (De bestanden /usr/pgsql/* slaan nergens op, negeer deze.)

sudo service postgresql-9.6 restart

Je zou nu moeten kunnen inloggen met psql --user $BLA -d postgres en ook op adminer (maar let op dat je een database kiest die bestaat).

Data migreren

Ruim eerst je DB een beetje op! (oftewel zorg dat je foreign keys kloppen, dat er geen datums zijn met jaar 0000, maand 00 of dag 00 enzo)

Dit is een volledige migratie, inclusief dbstructuur. Gebruik andere opties voor mysqldump om alleen data te verhuizen.

mysqldump --compatible=postgresql --user=root --password --default-character-set=utf8 test_whoswho4 > export.sql
python2.7 docs/db_converter.py export.sql pg-export.sql                    
psql -d test_whoswho4 -U root -f pg-export.sql

PRO-TIP: pas de relaties eerst handmatig aan, want die zijn niet echt goed over te zetten.

Vervolgens moeten we handmatig alle tabellen die in MySQL een autoincrement hadden, maar waar die kolom niet id heet, in PostgreSQL een sequencenummer geven. Dat ziet er ongeveer zo uit:

CREATE SEQUENCE IOUBon_bonID_seq;
SELECT setval('IOUBon_bonID_seq', max("bonID")) FROM "IOUBon";
ALTER TABLE "IOUBon" ALTER COLUMN "bonID" SET DEFAULT nextval('IOUBon_bonID_seq');

Heb je dat allemaal gedaan, dan moet je ook voor alle databaseusers rechten geven:

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO god;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO ingelogd;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO dibstablet;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO mollie;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO gast;

Nu moeten we ook nog de rechten overnemen. In MySQL doe je SHOW GRANTS FOR '$USER'@'localhost' voor alle users in de db-wachtwoorden, pas de output hiervan aan tot PostgreSQL-syntax en voer die uit. (Dit is een hoop werk!)