首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SQLAlchemy或SqlSoup ORM中自动反映表关系?

如何在SQLAlchemy或SqlSoup ORM中自动反映表关系?
EN

Stack Overflow用户
提问于 2011-07-21 22:18:07
回答 1查看 1.5K关注 0票数 6

如何告诉SQLAlchemy自动将基本外键引用反映为对其他对象的引用,而不是整型字段?

SQLAlchemy及其SqlSoup中,表列都是自动反映的,并且可以手动定义关系:

代码语言:javascript
复制
class User(Base):
    __table__ = metadata.tables['users']
    loan = relation(Loans)

..。

代码语言:javascript
复制
You can define relationships on SqlSoup classes:
>>> db.users.relate('loans', db.loans)
EN

回答 1

Stack Overflow用户

发布于 2012-10-31 19:55:47

尝试这个魔术)适用于简单的FK关系,并且没有db方案

代码语言:javascript
复制
from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import mapper, relation

engine = create_engine("sqlite://", echo=True)

engine.execute('''
    create table foo (
        id integer not null primary key,
        x integer
    )''')

engine.execute('''
    create table bar (
        id integer not null primary key,
        foo_id integer,
        FOREIGN KEY(foo_id) REFERENCES foo(id)
    )''')

metadata = MetaData()
metadata.reflect(bind=engine)


MAPPERS = {
}

repr_name = lambda t: '%s%s' % (t[0].upper(), t[1:])

for table in metadata.tables:

    cls = None
    # 1. create class object
    cls_name = repr_name(str(table))
    exec("""class %s(object): pass""" % cls_name)
    exec("""cls = %s""" % cls_name)

    # 2. collect relations by FK
    properties = {}
    for c in metadata.tables[table].columns:
        for fk in c.foreign_keys:
            name = str(fk.column).split('.')[0]
            properties.update({
                name: relation(lambda: MAPPERS[repr_name(name)]),
            })

    # 3. map table to class object 
    mapper(cls, metadata.tables[table], properties=properties)


    MAPPERS.update({cls_name: cls})

if __name__ == '__main__':
    from sqlalchemy.orm import sessionmaker

    print 'Mappers: '
    for m in MAPPERS.values():
        print m

    session = sessionmaker(bind=engine)()

    foo = Foo()
    foo.x = 1
    session.add(foo)

    session.commit()

    print session.query(Foo).all()

    bar = Bar()
    bar.foo = foo
    session.add(bar)
    session.commit()

    print session.query(Bar).all()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6777524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档