Simple SQL-Abfragen in Magento

Magento bietet einen hervorragenden Datenbank-Abstraktionslayer. Und im Allgemeinen sollte man diesen Layer auch für Datenabfragen und vor allem für Datenmodifikationen im Magento-System nutzen.

Manchmal ist es aber doch der einfachste und performanteste Weg, wenn man direkt per SQL auf die Datenbank zugreifen kann. Das geht auch in Magento, und zwar auf folgende Weise.

$sql = "SELECT foo FROM bar WHERE baz";
$data = Mage::getSingleton("core/resource")->getConnection(Mage_Core_Model_Resource::DEFAULT_READ_RESOURCE)->fetchAll($sql);

CakePHP Controller ohne Model und Datenbanktabelle

Wenn man in CakePHP einen Controller erstellt, ohne, dass man die zugehörige Datenbanktabelle anlegt, bekommt man die Fehlermeldung „Database table for model was not found“.

Um diese Fehlermeldung zu umgehen und einen Controller zu erstellen, der kein direktes Model nutzt, ist es jedoch möglich, wie im nachfolgenden Code-Schnipsel gezeigt, den Klassenparameter $uses auf null zu setzen. 

class FooController extends AppController
{
    var $uses = null;             // ohne Datenbanktabelle "foos" und Model "Foo"

    function doSomething()
    {
        $this->loadModel('User'); // andere Models nachladen geht trotzdem
    }
}

Problem mit Boolean in Hibernate mit MySQL

Wenn Hibernate mit MySQL und MySQLDialect oder MySQL5Dialect genutzt wird, kann es sein, dass der Datentyp Boolean nicht richtig funktioniert. Und zwar legt Hibernate ein Boolean-Feld in MySQL als BIT(1) an, womit scheinbar der JDBC-Treiber nicht klarkommt.

Damit Boolean-Felder mit Hibernate/MySQL richtig funktionieren, kann und sollte man den Datentyp des Feldes auf TINYINT(1) setzen. Mit Annotations geht das beispielsweise so:

@Column(columnDefinition="TINYINT(1)")
private boolean disabled;

Zum Nachlesen: Der Bugreport HH-468 von Hibernate über diesen Fehler.

MAMP oder XAMPP zur PHP-Entwicklung unter OS-X

mamp-gui
MAMP Gui

Als ich begann MAMP zu benutzen, vor ein paar Jahren, war es noch die einzige Möglichkeit unproblematisch einen Apache mit PHP und MySQL auf dem Mac zum Laufen zu bekommen. Inzwischen ist etwas Zeit vergangen und es gibt den aus der Windows- und Linux-Welt bekannten XAMPP als Alternative zu MAMP.

Zur Installation wird XAMPP, genauso wie MAMP einfach in den Programme-Ordner kopiert und ist dann auch sofort lauffähig. Die Komponenten von XAMPP lassen sich über das Terminal oder mit einer GUI Anwendung namens „XAMPP Controls“ starten und stoppen. Die Standardinstallation benutzt die allseits bekannten Ports 80 und 3306 für apache und MySQL, weshalb man zum Starten das Administrator-Passwort eingeben muss. MAMP hingegen lässt sich nur über die MAMP-GUI starten und stoppen, nicht über das Terminal. Die MAMP-GUI bietet verschiedene Einstellungen, wie z.B. die Ports unter denen Apache und MySQL laufen. Eine solche GUI-Konfiguration ist in den XAMPP Controls nicht enthalten, hier muss man sich mit der Konfiguration von PHP, MySQL und Apache auskennen.

XAMPP Controls
XAMPP Controls

Die Verzeichnisstruktur von XAMPP ist für jemanden, der schon mal ein bisschen auf einem Linux-Server rumgemacht hat, leicht verständlich. Alle Konfigurations-Dateien, wie my.cnf, httpd.conf und php.ini befinden sich im Ordner „etc“. Des weiteren finden wir einen „logs“-Ordner in dem die Logfiles landen und einen „htdocs“-Ordner, der als Wurzelverzeichnis für die Webserver-Dokumente dient. Bei MAMP ist die Ordner-Struktur ähnlich, sieht aber irgendwie etwas unaufgeräumter aus. In XAMPP kann man die verschiedenen Server, wie Apache, MySQL und ProFTP separat starten und beenden. In MAMP lassen sich Apache und MySQL nur gemeinsam steuern. Ein großes Manko von MAMP ist, dass man die my.cnf zur Konfiguration von MySQL vergeblich sucht.

Kann man nun eher MAMP oder XAMPP empfehlen? Ich persönlich bin von MAMP auf XAMPP umgestiegen, da es wesentlich mehr einer richtigen Server-Umgebung entspricht, umfangreichere Möglichkeiten der Konfiguration bietet und Distributionen für Linux, Windows und OS-X existieren. MAMP hingegen, das es nur für OS-X gibt, ist immer noch die bessere Wahl für Webdesigner oder Nebenbei-PHP-Programmierer die mal eben ein WordPress oder Joomla lauffähig haben wollen und Einstellungen am liebsten mit einem grafischen Benutzer-Interface machen.

Fazit: MAMP ist mehr Mac-mäßig und XAMPP besser für Profis Technikversierte wie Software-Entwickler.

Zum Ausprobieren:

Zur Webseite von MAMP

Zur Webseite von XAMPP

MySQL-Dump erzeugen und einspielen

Mit MySQL lassen sich über das Terminal einfach Datenbank-Dumps (Kopien der Datenbank) erzeugen und einlesen. Zum Erzeugen nutzt man den Befehl mysqldump und zum Einlesen eines Dumps den Befehl mysql.

Erzeugen

mysqldump -u$DBUSER -p$DBPASSWD -h$DBHOST $DATABASE > $FILENAME

Einlesen

mysql -u $DBUSER -p$DBPASSWD -h$DBHOST --database=$DATABASE < $FILENAME

 

Das Programm mysql befindet sich unter OS-X in MAMP und XAMPP an folgenden Stellen:

MAMP OS-X: /Applications/MAMP/Library/bin/mysql
XAMPP OS-X: /Applications/xampp/xamppfiles/bin/mysql

Schnellerer Dump für MyISAM-Tabellen mit mysqlhotcopy

Falls die Datenbank nur aus MyISAM-Tabellen besteht, kann man Backups auch wesentlich schneller mit dem Programm mysqlhotcopy erstellen. mysqlhotcopy sperrt lediglich alle Tabellen und kopiert dann das Dateiverzeichnis, welches sich üblicherweise in /var/lib/mysql befindet. Dieser Backup ist dann nicht besonders kompatibel aber eben so schnell, wie es grade braucht, die Daten auf der Festplatte zu kopieren.

Query-Cache in MySQL aktivieren

Seit der Version 4.0 besitzt MySQL einen Query-Cache. Dieser Cache speichert Ergebnisse von SQL-Abfragen im Speicher und antwortet, wenn die exakt gleiche Daten-Abfrage erneut kommt, mit dem gecachten Ergebnis.

Jede Tabelle hat ihren eigenen Cache. Bei schreibendem Zugriff (Daten Manipulation) auf die Tabelle muss deren Cache gelöscht werden. Die Aktivierung des Caches ist daher vor allem dann sinnvoll, wenn die Anwendung mehr aus der Datenbank liest, als schreibt. 

In den meisten Web-Anwendungen, wie beispielsweise Foren oder Datenbank-Archive werden Daten wesentlich öfter abgefragt als geschrieben, so dass die Aktivierung des Query-Cache in MySQL einen hohen Performance-Gewinn bringen kann.

Aktiviert werden kann dieser Cache per Konfiguration im Abschnitt [mysqld] der my.cnf Konfigurationsdatei von MySQL. Eine Beispiel-Konfiguration könnte so aussehen:

# Maximale Groesse eines Abfrage Ergebnisses, damit es gecached wird
query_cache_limit       = 1M
# Gesamtgroesse des Cache
query_cache_size        = 16M

Der Status des Cache, also wie viele Anfragen sich beispielsweise im Cache befinden und wie gut der zur Verfügung stehende Cache-Speicher genutzt wird, kann man sich mit folgendem Statement anzeigen lassen:

SHOW STATUS LIKE 'Qcache%';

Wichtig ist, dass die Zahl „Qcache_lowmem_prunes“ möglichst gering bleibt, da sie steigt, wenn aufgrund fehlenden Speichers Anfragen aus dem Cache entfernt wurden. In diesem Fall ist es sinnvoll die „query_cache_size“ zu erhöhen.

Dokumentation des MySQL Query-Cache auf den Seiten von MySQL