Linux mini-howto?
Krátce o nástrojích ze života sysadmina.
Databáze MySQL/MariaDB je důvěrně známá a napříč opensource světem široce používaná, obsahuje dva jednoduché SQL příkazy DROP TABLE a DROP DATABASE pro smázení tabulky či celé db.
Bohužel/bohudík neexistuje žadný příkaz “DROP ALL TABLES” ve smyslu smaž všechny tabulky v aktuální db.
Když už narazíte na “zkryplený” návrh celé DB, kde si původní autor dohání potřebu řádků a relací množstvím a tabulek a jejich jméno používá jako klíč je na čase po notné dávce relaxační hudby vymyslet jak smazat těch 1146 tabulek, jasně můžete udělat drop databases a pak create database, ale třeba to zrovna takto nechcete/nemůžete.
Varianta 1. (ktéra se mi vůbec nelíbí zápisem, ale je elegantní)
SET FOREIGN_KEY_CHECKS = 0;
SET @tables = NULL;
SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables
FROM information_schema.tables
WHERE table_schema = 'database_name';
SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
Varianta 2. (aneb plivneme si postaru unixovsky do dlaní)
SQLite je transakční databázových systém, s nulovou konfigurací, bez serverové části, jednoduchý, kompaktní, lehký design, postavený nad souborovým systémem respektive souborem.
SQLite je velmi populární, né vždy je totiž nutné a hlavně možné nasadit plnohodnotný klient-server SQL server (Mariandb, Postgres) ale mít po ruce možnost a výhody sql nad souborem se často hodí (např. i v systému Android).
Ve své podstatě jde o implementaci relačního databázového systému a standardu SQL-92 realizovaného v jazyce C (mimochodem zajímavě napsaná knihovna s implementací objektů pomocí struktur, pointerů).
Velmi často se používá SQLite v jazyce Perl přes knihovnu DBI, ukažme si základní snippet ve kterém bude vše co je potřeba pro práci s touto databází.
#!/usr/bin/perl
use DBI;
use strict;
my $driver = "SQLite";
my $db_name = "sqlite.db";
my $dbd = "DBI:$driver:dbname=$db_name";
# sqlite nepoužívý jméno a heslo
my $username = "";
my $password = "";
# vytvoříme a připojíme se db
# zároveň dojte k vytvoření souboru databáze sqlite.db
my $dbh = DBI->connect($dbd, $username, $password, { RaiseError => 1 }) or die $DBI::errstr;
# vytvoříme tabulku
my $stmt = qq(CREATE TABLE IF NOT EXISTS NETWORK
(ID INTEGER PRIMARY KEY AUTOINCREMENT,
HOSTNAME TEXT NOT NULL,
OS CHAR(50),
CPULOAD REAL););
# provedeme dotaz
my $ret = $dbh->do($stmt);
if($ret < 0) { print STDERR $DBI::errstr; }
else { print STDERR "Tabulka vytvořena\n"; }
# vložíme řádky do tabulky
$stmt = qq(INSERT INTO NETWORK (HOSTNAME,OS,CPULOAD)
VALUES ('linux-01', 'Debian 8', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;
$stmt = qq(INSERT INTO NETWORK (HOSTNAME,OS,CPULOAD)
VALUES ('linux-02', 'CentOS 7', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;
$stmt = qq(INSERT INTO NETWORK (HOSTNAME,OS,CPULOAD)
VALUES ('windows-01', 'Windows Server 2012', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;
# získání dat z tabulky a výpis
$stmt = qq(SELECT id, hostname, os, cpuload from NETWORK;);
my $obj = $dbh->prepare($stmt);
$ret = $obj->execute() or die $DBI::errstr;
if($ret < 0) { print STDERR $DBI::errstr; } while(my @row = $obj->fetchrow_array()) {
print "ID: ". $row[0] . "\n";
print "HOSTNAME: ". $row[1] ."\n";
print "OS: ". $row[2] ."\n";
print "CPULOAD: ". $row[3] ."\n\n";
}
# změna záznamu
$stmt = qq(UPDATE NETWORK set CPULOAD = 50 where OS='CentOS 7';);
$ret = $dbh->do($stmt) or die $DBI::errstr;
if( $ret < 0 ) { print STDERR $DBI::errstr; }
else { print STDERR "Aktualizováno $ret řádků\n"; }
# smazání
$stmt = qq(DELETE from NETWORK where ID=2;);
$ret = $dbh->do($stmt) or die $DBI::errstr;
if($ret < 0) { print STDERR $DBI::errstr; }
else { print STDERR "Smazáno $ret řádků\n"; }
# Odpojení databáze
$dbh->disconnect();
Jak je vidět z příkladu použití je skutečně jednoduché a přímočaré, nebojte se ho vyzkoušet ve svých projektech, mnoho lidí do startu špatně odhadne požadavky a SQLite je tím pádem neprávem ignorováno jako něco podřadného, přejít na “vyšší” databáze z SQLite je triviální.
Knihovny (binding) existuje pro celou řadu programovacích jazyků kromě uvedeného Perl, např. C/C++, Python, Lua, PHP, ale např. i Delphi a další.
SQLite není okrajový zapadlý projekt, je integrován přímo do systému Android pro uložení persistentních dat, používá ho iPhone nebo společnost Airbus ve svém software či firma Adobe, Bosh, Dropbox. (https://www.sqlite.org/famous.html)