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 =