2010-02-17 5 views
0

Je me sens comme cela devrait être simple, mais je ne peux pas trouver un seul exemple de ce fait.sqlalchemy 0.6 accès à la base de données existante?

À titre d'exemple, j'ai les tableaux existants suivants:

CREATE TABLE `source` (
    `source_id` tinyint(3) unsigned NOT NULL auto_increment, 
    `name` varchar(40) default NULL, 
    PRIMARY KEY (`source_id`), 
    UNIQUE KEY `source_name` (`name`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 

CREATE TABLE `event` (
    `source_id` tinyint(3) unsigned NOT NULL default '0', 
    `info` varchar(255) NOT NULL default '', 
    `item` varchar(100) NOT NULL default '', 
    PRIMARY KEY (`source_id`,`info`,`item`), 
    KEY `event_fkindex1` (`source_id`), 
    CONSTRAINT `event_fk1` FOREIGN KEY (`source_id`) REFERENCES `source` (`source_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Je voudrais utiliser sqlalchemy 0,6 pour ajouter beaucoup de lignes à la table des événements. J'ai vu quelques exemples de sqlsoup, mais je déteste vraiment la manière dont il accède à la base de données en appelant constamment l'objet db. Je suivais les documents pour les trucs de réflexion db et a obtenu jusqu'ici:

import sqlalchemy 
from sqlalchemy import Table, Column, MetaData, create_engine 
from sqlalchemy.orm import sessionmaker 
engine = create_engine('mysql://user:[email protected]/db', echo=True) 
metadata = MetaData() 
source = Table('source', metadata, autoload=True, autoload_with=engine) 
Session = sessionmaker(bind=engine) 
session = Session() 
session.query(source).first() 

Ce retourne un objet vraiment laid. Je veux vraiment la fonctionnalité de mappeur de l'ORM sqlalchemy pour pouvoir construire des objets Event à insérer dans la BD.

Je regardais les trucs sqlsoup:

from sqlalchemy.ext.sqlsoup import SqlSoup 
db = SqlSoup(engine) 
db.sources.all() #this kinda works out bet 

Mais je ne pouvais pas comprendre comment ajouter des objets forment ce point. Je ne suis même pas sûr que ce soit ce que je veux, j'aimerais pouvoir suivre le didacticiel et les trucs declarative_base. Est-ce possible sans avoir à réécrire une classe pour modéliser toute la structure de la table? Si ce n'est pas le cas, quelqu'un peut-il me montrer comment je ferais cela dans cet exemple?

Quelqu'un peut-il me mettre sur la bonne voie pour faire fonctionner le mapper?

Répondre

2

Vous pouvez utiliser une table prédéfinie/autoloaded avec declare_base en l'affectant à l'attribut __table__. Les colonnes sont récupérées à partir de la table, mais vous aurez toujours déclarer toutes les relations que vous souhaitez utiliser.

class Source(Base): 
    __table__ = source 

class Event(Base): 
    __table__ = event 
    source = relation(Source) 

Toutefois, si vous allez insérer une énorme quantité de lignes, puis faire le tour du ORM et en utilisant executemany vous obtiendrez une augmentation des performances. Vous pouvez utiliser exécuter beaucoup comme ceci:

conn = engine.connect() 
conn.execute(event.insert(),[ 
    {'source_id': 1, 'info': 'xyz', 'item': 'foo'}, 
    {'source_id': 1, 'info': 'xyz', 'item': 'bar'}, 
    ... 
]) 
Questions connexes