2009-07-22 7 views
1

Wie nah kann ich zu definieren, ein Modell in SQLAlchemy erhalten wie:SQLAlchemy - Modelle - mit dynamischen Feldern - Active

class Person(Base): 
    pass 

Und gerade haben sie dynamisch die Feldnamen abholen? Wie auch immer, um Benennungskonventionen zu erhalten, um die Beziehungen zwischen Tabellen zu steuern? Ich denke, ich suche etwas ähnliches wie RoRs ActiveRecord, aber in Python.

Nicht sicher, ob das wichtig ist, aber ich werde versuchen, dies unter IronPython statt cPython zu verwenden.

Antwort

4

Es ist sehr einfach automatisch die Feldnamen holen:

from sqlalchemy import Table 
from sqlalchemy.orm import MetaData, mapper 

metadata = MetaData() 
metadata.bind = engine 

person_table = Table(metadata, "tablename", autoload=True) 

class Person(object): 
    pass 

mapper(Person, person_table) 

Mit diesem Ansatz haben Sie die Beziehungen in dem Aufruf von mapper() zu definieren, so dass keine automatischen Erkennung von Beziehungen.

automatisch Klassen auf Tabellen mit demselben Namen Karte, könnten Sie tun:

def map_class(class_): 
    table = Table(metadata, class_.__name__, autoload=True) 
    mapper(class_, table) 

map_class(Person) 
map_class(Order) 

Elixir alles tun, könnten Sie wollen.

+0

+1. Was ist mit automatischen Beziehungen basierend auf Namenskonvention - unterstützt? Gute Verbindung zu Beispielen? danke codeape – BuddyJoe

+0

Ich glaube nicht, dass dies für Beziehungen funktioniert. Diese müssen im Mapper manuell definiert werden. – sebasgo

+0

autoload = True erstellt die Datenbankmetadaten aus dem Datenbankschema, und Mappings für einfache Datenfelder werden automatisch erstellt, aber Sie müssen die Relationen immer noch manuell definieren, da einige Dinge nicht erraten werden können Zeile eins zu viele oder eins zu eins aus dem Datenbanklayout. – sebasgo

2

AFAIK sqlalchemy entkoppelt absichtlich Datenbank Metadaten und Klassenlayout.

Sie könnten Elixir untersuchen (http://elixir.ematia.de/trac/wiki): Active Record Pattern für sqlalchemy, aber Sie müssen die Klassen definieren, nicht die Datenbanktabellen.