2009-07-22 8 views
1

Comment puis-je obtenir près de définir un modèle SQLAlchemy comme:sqlalchemy - Modèles - en utilisant des champs dynamiques - ActiveRecord

class Person(Base): 
    pass 

Et l'avez choisir dynamiquement les noms de champs? de toute façon obtenir des conventions de nommage pour contrôler les relations entre les tables? Je suppose que je cherche quelque chose de similaire à ActiveRecord de RoR mais en Python.

Je ne sais pas si cela compte, mais j'essaierai de l'utiliser sous IronPython plutôt que cPython.

Répondre

4

Il est très simple de choisir automatiquement les noms des champs:

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) 

En utilisant cette approche, vous devez définir les relations dans l'appel à mapper(), donc pas d'auto-découverte de relations.

Pour mapper automatiquement les classes aux tables avec le même nom, vous pouvez faire:

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

map_class(Person) 
map_class(Order) 

Elixir peut faire tout ce que vous voulez.

+0

+1. Qu'en est-il des relations automatiques basées sur la convention de dénomination - supportées? bon lien avec des exemples? merci codeape – BuddyJoe

+0

Je ne pense pas que cela fonctionne pour les relations. Ceux-ci doivent être définis manuellement dans le mappeur. – sebasgo

+0

autoload = True crée les métadonnées de base de données à partir du schéma de base de données, et les mappings pour les champs de données simples sont créés automatiquement, mais vous devez toujours définir manuellement les relations, car certaines choses ne peuvent pas être détectées ligne par ligne. à un à partir de la mise en page de la base de données. – sebasgo

2

AFAIK sqlalchemy déconnecte intentionnellement les métadonnées de la base de données et la disposition des classes.

Vous devriez rechercher Elixir (http://elixir.ematia.de/trac/wiki): Modèle d'enregistrement actif pour sqlalchemy, mais vous devez définir les classes, pas les tables de base de données.

Questions connexes