Archive for the 'Planet' Category

python elixir session

Zur Zeit mache ich beim ZID mein Praxissemester, ich programmiere für uns den Python Computer Room Manager (pycrman). Dieses Projekt ist in Python geschrieben und benutzt verschiedene Python Erweiterung. Zur einer Erweiterung will ich hiermit ein bissel was schreiben :)

Elixir

Elixir ist “dünner” Wrapper für die SQLAlchemy Library. Beide zusammen vereinfachen den Umgang mit einer Datenbank in Python um ein vielfaches.

Hier ein kleines Beispiel mit 2 Tabellen:

# import elixir stuff
from elixir import *
 
# setup db connection
metadata.bind = "sqlite:///movies.sqlite"
metadata.bind.echo = True
 
# first table
class Device(Entity):
  """representation of a device
  """
  using_options(tablename='device', inheritance='multi')
 
  id = Field(Integer, primary_key=True)
  name = Field(String(127), required=True, unique=True)
  domain = Field(String(255), required=True)
  interfaces = OneToMany('Interface')
 
  def __repr__(self):
    return 'Device %s' % (self.name)
 
# second table
class Interface(Entity):
  """network interfaces
  """
  using_options(tablename='interface')
 
  id = Field(Integer, primary_key=True)
  name = Field(String(16), required=True)
  ip = Field(String(38), required=True, unique=True)
  mac = Field(String(17), unique=True)
 
  device = ManyToOne('Device')
 
  def __repr__(self):
    return '<Interface: %s ip: %s mac: %s>' % (
        self.name, self.ip, self.mac)
 
setup_all()
drop_all()
create_all()

und schon kann mal auf einfache und sehr elegante Weise diese 2 Tabellen benutzen:

# create new device object
device = Device(name="foobar")
device.domain = "test.localdomain"
 
# create new interface object
interface = Interface(name="eth0", ip="1.1.1.1")
 
# add interface object to device object
device.interfaces = [interface]
 
# store objects in db
session.flush([device, interface])
 
# query
device = Device.get_by(name="foobar")
print device

Ein schönes Beispiel gibt es auch im Elixir Tutorial.

Noch ein kleiner Beitrag zu den elixir/sqlalchemy sessions. In der Standard Einstellung sind die Elixir sessions sogenannte “scoped_session”, d.h. das jeder Thread in einer threaded Umgebung seine eigene Elixir session hat. Das hat zur folge, das wenn ein Thread ein Objekt anlegt bzw. verändert, ein anderer Thread das nicht unbedingt mit bekommt, da Elixir/SQLAlchemy die Query Resultate cached. Am besten geht man damit um das man den Cache ausschaltet:

import elixir
elixir.options_defaults['mapper_options'] = dict(always_refresh=True)

oder bei einer Query populate_existing() benutzt.


posted with Vim

wordpress upgrade

mal wieder :)

das neue wordpress 2.5 backend is echt hübsch, gefällt mir besser als das alte.

Vimpress, publish WordPress blog posts from Vim

Ich habe gerade vimpress installiert. Mit diesem kleinen feinen vim plugin kann man aus dem vim heraus wordpress blog eintraege erstellen, speichern, listen und sogar wieder bearbeiten.

die kommandos sind folgende 4:

  • :BlogList Lists all articles in the blog
  • :BlogNew Opens page to write new article
  • :BlogOpen id Opens the article id for edition
  • :BlogSend Saves the article to the blog

Vielleicht schaffe ich es damit oefters ein posting zu machen ;)