sqlalchemy 一对多/多对一/多对多/一对一关系定义设置全方位操作方法

sqlalchemy 作为一款ORM在操作数据库方面非常的方便,这里总结了一些对应关系的设置以及查询方法!

使用外键关联表:
表设计

from sqlalchemy import Column, ForeignKey
from sqlalchemy.types import String, Integer, CHAR, BIGINT

class Blog(BaseModel):
    __tablename__ = 'blog'

    id = Column(BIGINT, primary_key=True, autoincrement=True)
    title = Column(String(64), server_default='', nullable=False)
    text = Column(String, server_default='', nullable=False)
    user = Column(BIGINT, ForeignKey('user.id'), index=True, nullable=False)
    create = Column(BIGINT, index=True, server_default='0', nullable=False)


class User(BaseModel):
    __tablename__ = 'user'

    id = Column(BIGINT, primary_key=True, autoincrement=True)
    name = Column(String(32), server_default='', nullable=False)
    username = Column(String(32), index=True, server_default='', nullable=True)
    password = Column(String(64), server_default='', nullable=False)

提交数据

session = Session()
user = User(name='first', username=u'新的')
session.add(user)
session.flush()#这个为了放回 id
blog = Blog(title=u'第一个', user=user.id)
session.add(blog)
session.commit()

一: 一对多关系

  • 表设计

        class Parent(Base):  # 一
        __tablename__ = 'parent'
        id = Column(Integer, primary_key=True)
        name = Column(String(64),nullable=False)
        full_name = Column(String(64))
        children = relationship("Child")
         # 默认返回的是列表,collection_class=set 加他返回的是集合, 
         #collection_class=attribute_mapped_collection('name') 返回的是name 字典 值从属性中取
         #collection_class=mapped_collection(lambda children: children.name.lower() 这个可以自定义值
       # 在父表类中通过 relationship() 方法来引用子表的类集合
    
        class Child(Base):  #多
            __tablename__ = 'child'
            id = Column(Integer, primary_key=True)
            name = Column(String(64),nullable=False)
            full_name = Column(String(64))
            parent_id = Column(Integer, ForeignKey('parent.id'))
            # 在子表类中通过 foreign key (外键)引用父表的参考字段
    
  • 添加数据

    parent = Parent(name='morgan', full_name='morganlions')
    parent.children = Child(name='child 1 name',full_name='child 1 full name')
    session.add(parent)
    session.commit()
    #如果parent 已经存在
    parent = session.query(Parent).filter(Parent.name=='Morgan')
    children = [
                Child(name='child 2', full_name='child 2 full name', parent_obj = parent),
                Child(name='child 3', full_name='child 3 full name', parent_obj = parent),
    ]
    session.add_all(children)
    session.commit()
    
  • 查询数据(单向关系)

    parent = session.query(Parent).get(1)
    print(parent.children)
    #一对多查询
    parent = session.query(Parent).filter(Parent.children.any(Child.name==u'child 1')).first()
    

二:多对一关系

这个相比上面的一对多而言是双向的关系.

  • 表设计

    class Parent(Base):#一
        __tablename__ = 'parent'
        id =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值