我觉得这应该很简单,但我找不到一个例子。
例如,我有以下现有表:
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 的方式。我遵循了 db 反射的文档并做到了这一点:
import sqlalchemy
from sqlalchemy import Table, Column, MetaData, create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine('mysql://user:pass@server/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 的东西。这是否可能无需重写一个类来对整个表结构进行建模?如果不是,有人可以告诉我在这个例子中我会怎么做吗?
有人可以让我找到正确的路径来让映射器工作吗?