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;

Node.js Mysql

Ich muß einen recht großen Haufen Daten von einer Mysqldatenbank nach Mongodb schaufeln. Das ganze spielt in der Kommandozeile.

app.js

var mysql = require('mysql');
 
config=require('./config').production;
 
var connection = mysql.createConnection({
    host : config.mysqlHost,
    port : config.mysqlPort,
    database: config.mysqlDatabase,
    user : config.mysqlUser,
    password : config.mysqlPassword
});
 
 
connection.connect(function(err){
	if(err != null) {
		console.log(err);
	}
	connection.query("SELECT * from  feeds", function(err, rows){
	if(err != null) {
		console.log("Problem with Query "  +err);    
	} else {
	    // Shows the result on console window
	    console.log(rows[0]);
 
 
	    connection.end();
 
	}
 
	});
 
});

package.json

{
  "name": "node-mysqltest",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app"
  },
  "dependencies": {
 
    "mysql" : "*"
  }
}

config.js

var config ={};
 
config.development = {
 
};
 
config.production = {
 
 
  mysqlPort:3306,
  mysqlHost:'localhost',
  mysqlDatabase:'<DB>',
  mysqlUser: '<USR>',
  mysqlPassword:  '<PWD>',
 
  env : global.process.env.NODE_ENV || 'production'
};
 
 
module.exports  = config;

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.

Angepasste RSS Feeds für WordPress

Aus gegebenen Anlass muß ich mich mal wieder mit meiner liebsten Blog/ CMS Software beschäftigen. Genauer gesagt geht es um Feeds und wie man sie aus WordPress rauskitzeln kann.

Wenn man /feed an die Url anhängt wird statt Html Xml ausgegeben:

http://schmiddi.co.cc/feed/

 

Dank mod_rewrite kann man den Feed nach verschiedensten Parametern filtern:

http://schmiddi.co.cc/2010/feed/

http://schmiddi.co.cc/category/linux/feed/

http://schmiddi.co.cc/tag/sticker/feed/

http://schmiddi.co.cc/comments/feed/

 

Mit GET Parametern sind dem Spaß keine Grenzen mehr gesetzt. Dem ungeübten sei gesagt, daß GET Parameter für Rattenschwanzlange Links verantwortlich sind.

Der 1. Parameter hängt mit einem Fragezeichen an der aktuellen Url, weitere kann man mit einem & Zeichen anhängen.

Um Einträge der Kategorie Linux anzuzeigen muß diese Url aufgerufen werden:

http://schmiddi.co.cc/feed/rss/?cat=7

 

Die ID 7 habe ich aus der Datenbank. Die WordPress Entwickler haben sich ein schlüssiges und gut verständliches Schema ausgedacht.

Einen Überblick über die Kategorien deines Blogs bekommst Du mit diesem SQL Befehl:

SELECT t.name, t.term_id
FROM wp_terms AS t, wp_term_taxonomy AS tax
WHERE tax.taxonomy = 'category' AND tax.term_taxonomy_id=t.term_id;

Wenn man eine Kategorie ausblenden möchte muß man das Minus Zeichen benutzen:

http://schmiddi.co.cc/?cat=-3

 

 

Man kann auch mehrere Id’s übergeben. Diese müssen mit einem Komma getrennt werden:

http://schmiddi.co.cc/feed/?cat=8,9,10,11,13,18,20

 

Weitere Parameter füge ich hier ein sobald ich sie benötige.

 

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 🙂