我正在寻找一种方法来告诉sqlalchemy将一些标签上的复杂查询映射到自定义类MyResult
而不是默认的RowProxy
类。这里有一个简单的工作示例如何将查询结果映射到sqlalchemy中的自定义对象?
'''
create table foo(id integer, title text);
create table bar(id integer, foo_id integer, name text);
insert into foo values(0, 'null');
insert into foo values(1, 'eins');
insert into bar values(0,0, 'nullnull');
insert into bar values(1,0, 'einsnull');
insert into bar values(2,1, 'zweieins');
'''
和下面的代码:
from sqlalchemy import *
from itertools import imap
db = create_engine('sqlite:///test.db')
metadata = MetaData(db)
class MyResult(object):
def __init__(self, id, title, name):
self.id = id
self.title = title
self.name = name
foo = Table('foo', metadata, autoload=True)
bar = Table('bar', metadata, autoload=True)
result = select([foo.c.id, foo.c.title, bar.c.name], foo.c.id == bar.c.foo_id).execute().fetchall()
现在我正在寻找一种方式来告诉SQLAlchemy的从结果行MyResult进行映射。
row = result[0]
print type(row)
#<class 'sqlalchemy.engine.base.RowProxy'>
print row.items()
#[(u'id', 0), (u'title', u'null'), (u'name', u'einsnull')]
我知道我可以用手工做的东西映射像
my_result = imap(lambda x: MyResult(**x), result)
,但我有一种感觉,这不是处理它在SQLAlchemy的方式。
这个例子不是很复杂,是真实的世界问题复杂吗?但最重要的是:这两个表之间的“现实生活”关系是什么:a)它实际上是表之间的“1-1关系”,两个组合的行代表一个“对象”实例(a-la继承); b)单Foo可以被5个Bars('1-n relationship')引用。在这种情况下,您的映射将不起作用,因为“id”列(用作PK)可能不是唯一的。 x)是仅这些视图还是希望能够通过创建并保存新的MyResult实例来添加新的数据库行? – van 2012-04-17 09:55:34
真实世界的例子是连接4个表格。 1-n关系从雪片模式。我知道id问题,但可以通过连接的唯一ID或其他方式解决它。保存实例不是必需的。 – 2012-04-19 12:34:41