2010-02-17 104 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() 

這將返回一個非常醜陋的對象。我真的想要sqlalchemy ORM的映射器功能,所以我可以構造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) 

但是,如果您要插入大量的行,那麼繞過ORM並使用executemany會使您的性能提高很多。你可以使用像這樣執行很多:

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