Doctrine Naming Strategy in Zend Framework 2

Database Table Prefixes are easy to configure with the Doctrine Naming Strategies.
Just create and register a new Strategy in your global config:

config/autoload/global.php

<?php
 
 
namespace Album\Doctrine\Strategy;
 
 
use Doctrine\ORM\Mapping\DefaultNamingStrategy;
 
class PrefixNamingStrategy extends DefaultNamingStrategy
{
    /**
     * {@inheritdoc}
     */
    public function classToTableName($className)
    {
        return '_' . substr($className, strrpos($className, '\\') + 1);
    }
}
<?php
return array(
     /* ... */
    'doctrine' => array(
        'configuration' => array(
            'orm_default' => array(
                'naming_strategy' => new \Album\Doctrine\Strategy\PrefixNamingStrategy()
            ),
        ),
 
    ),
   /* ... */  
);

References:
Doctrine Manual Implementing a NamingStrategy

Mysql INSERT if not exists

Für ein kleines Projekt speichere Auflösungen von Geräten in einer Tabelle ab um Bildbearbeitungen im vorraus zu erledigen und nicht erst wenn das Bild angefragt wird.
Um die Datenbank sauber zu halten möchte ich natürlich jeden Datensatz genau einmal haben und das mit so wenig Sql Queries wie möglich erledigen.
Dies ist die einfachste Lösung auf die ich gestoßen bin:

INSERT INTO resolutions (w, h) 
 
SELECT  100, 100 FROM resolutions
WHERE NOT EXISTS(
        SELECT w, h FROM resolutions WHERE w=100 AND h=100
 
) LIMIT 1;

DB Dumps in Mysql importieren

Irgendwann sitzt man vor dem Dump einer Datenbank und möchte diesen in sein RDBMS einspielen. Das ist keine große Sache, aber je nach Dump muß man ein wenig Zeit mitbringen und vielleicht ein wenig tricksen. Um Verwirrungen zu vermeiden nenne ich den Mysql Server RDBMS – also relationales Datenbank Management System. Unter Linux heißt der Prozess mysqld. Das RDBMS verwaltet wie der Name schon sagt Datenbanken die Tabellen mit Daten enthalten. Soweit so klar? Auf gehts ab gehts 🙂

Das Tool meiner Wahl für den Import – und auch um Queries abzusetzen –  ist der mysql Client.

Verbinde Dich auf die Maschine auf der mysqld läuft und starte mysql

mysql -u <user> -p

Mit -p wird die Passwortabfrage für den angegebenen Nutzer erzwungen.

Nun wird eine Datenbank angelegt in die der Dump geschaufelt wird

mysql> create database dump;

Befehle werden immer mit einem Semikolon terminiert. Mit   q kann man den Mysql Prompt jederzeit verlassen.

Eine einzelne Datei mit Tabellenbeschreibungen und Werten läßt sich so importieren:

mysql -u root -p  <DBNAME>  < sqldump.sql

Der Inhalt der Datei sqldump.sql wird einfach zum mysql Befehl umgeleitet. In meinem Beispiel ist DBNAME=dump.

Mit dem Schalter -v (verbose – gesprächig) kann man mysql bei der Arbeit zusehen oder die Ausgabe analysieren.

Wenn der Dump aus mehreren Dateien besteht gibt man die einfach mit cat aus und leitet sie an mysql weiter:

cat *sql |mysql -u root -p <DBNAME>

Man kann der Datenbank auch beim wachsen zusehen, dafür ist der Befehl du ideal:

watch du -h /var/lib/mysql/<DBNAME>

Bitte beachte, daß der Befehl kann nur als Root User erfolgreich ausgeführt werden.

Manchmal steht es mit der referentiellen Integrität des Dumps nicht zum Besten. Mit der Option -f kann man das Laden erzwingen. Allerdings ist ein Datenverlust beim Import sehr wahrscheinlich

cat *sql |mysql -f -u root -p <DBNAME>

Wie ich schon schrieb muß man je nachdem was und wieviel man importieren möchte ein wenig Zeit mitbringen.

Mysql Queries „debuggen“

Ich bin hier wieder mit verrückten Sachen beschäftigt bei denen ich unbedingt einen Blick auf die abgesetzten Queries werfen möchte. Statt nun irgendeine dämliche Subroutine zu schreiben die im Produktivbetrieb ausgeschaltet werden muß möchte ich ganz einfach die Ausgaben mit tail überwachen.

Das Logging kann in der Datei /etc/mysql/my.cnf aktiviert werden. Einfach das # vor

general_log_file        = /var/log/mysql/mysql.log

wegnehmen. Die Datei muß existieren und mysqld sollte reinschreiben können.

Nach einem Neustart des Dienstes kann man wunderbar die Arbeit auf der Datenbank mitverfolgen. Viel Vergnügen 🙂

 

Creole ist tot…

Eben mal kurz was in der Api von Creole nachlesen wollen, da las ich die böse Botschaft: Creole ist tot, keiner kümmert sich mehr drum.:(

Wirklich schade. Wem’s neu ist, Creole ist ein ziemlich netter Abstraction Layer um datenbankunabhängig und injectionsicher PHP zu Programmieren.

Es garantiert Typsichertheit (was eine Seltenheit in dieser merkwürdigen Sprache ist) und war einer der wenigen Lichtblicke für mich beim PHP Schreiben.

SQL für den Gottimperator

Ab und an steht man in SQL vor Problemen. Ich schätze mich weder als Laien, noch als Könner ein. Eher als Hasser und erklärten Feind von Datenbankkrams. Irgendwann wirds auch Objektorientierte Datenbanken für die Breite Masse und OpenSource geben, oder ich mache nur noch Sachen mit Ruby on Rails. Leider liegt das noch in einer weiten oder weniger weit entfernten Zukunft und ich muß den Müll immer noch  selbst machen. Eben stand ich vor dem Problem, dass ich entweder ein Update, oder ein Insert machen muß. Statt die Chose mit 5 Zeilen PHP zu lösen (was noch gruseliger wär) hab ich mir folgenden Befehl ergooglet (das prepared Statement kann mich an dieser Stelle mal)

$stmt=“

INSERT INTO cron_result (r_id, b_id,time, result, resultcode) VALUES ($r_id,$b_id,NOW(),“$retval“,$retcode)

ON DUPLICATE KEY

UPDATE time=NOW(), result=“$retval“, resultcode=-$retcode

„;

Toller Trick. Die Now Funktion aus einem älteren Beitrag wurde auch Weise genutzt 🙂