2010-02-17 3 views
0

Я чувствую, что это должно быть просто, но я не могу найти один пример этого.sqlalchemy 0.6 доступ устаревшей базы данных?

В качестве примера я имею следующие существующие таблицы:

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; 

Я хотел бы использовать SQLAlchemy 0.6, чтобы добавить много строк в таблице событий. Я видел несколько примеров sqlsoup, но очень ненавижу, как он обращается к db, постоянно вызывая объект db. Я последовал за документацию к вещам дб отражения и получил это далеко:

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() 

Это возвращает действительно некрасивый объект. Я действительно хочу функциональность mapper ORM sqlalchemy, чтобы я мог создавать объекты Event для вставки в БД.

Я смотрел на sqlsoup вещи:

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

Но я не мог понять, как добавить объекты образуют эту точку. Я даже не уверен, что это то, что я хочу, я хотел бы иметь возможность следить за учебником и материалом declarative_base. Возможно ли это, без необходимости переписывать класс для моделирования всей структуры таблицы? Если его нет, может кто-нибудь покажет мне, как бы я сделал это в этом примере?

Может ли кто-нибудь установить меня по правильному пути для получения работы картографа?

ответ

2

Вы можете использовать предопределенную/автоматически загруженную таблицу с declarative_base, назначив ее атрибуту __table__. Столбцы собираются из таблицы, но вы все равно будете объявлять какие-либо отношения, которые хотите использовать.

class Source(Base): 
    __table__ = source 

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

Однако, если вы собираетесь вставлять огромное количество строк, то происходит вокруг ОРМ и использования executemany получит Вас большой прирост производительности. Вы можете использовать выполнить много таких:

conn = engine.connect() 
conn.execute(event.insert(),[ 
    {'source_id': 1, 'info': 'xyz', 'item': 'foo'}, 
    {'source_id': 1, 'info': 'xyz', 'item': 'bar'}, 
    ... 
]) 
Смежные вопросы