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
0 Responses to “python elixir session”
Leave a Reply