一对多:

(一)表的创建

步骤1、创建外键,建立一对多关系,建在多里

步骤2、创建关联,建在一或多里均可,与表结构无关,仅方便添加和查询

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://root@127.0.0.1:3306/chouti?charset=utf8")

Base = declarative_base()

class Favor(Base):
    __tablename__ = 'favor'
    nid = Column(Integer,primary_key=True,autoincrement=True)
    caption = Column(String(50),default='red',unique=True)
    # pers = relationship("Person",backref='favor')       # 创建关联,与下同
    def __repr__(self):
        return "%s-%s"%(self.nid,self.caption)

class Person(Base):
    __tablename__ = 'person'
    nid = Column(Integer,primary_key=True,autoincrement=True)
    name = Column(String(32),index=True,nullable=True)
    favor_id = Column(Integer,ForeignKey("favor.nid"))    # 创建外键
    favor = relationship("Favor",backref='pers')          # 创建关联,与表结构无关,只是方便查询

Base.metadata.create_all(engine)
# Base.metadata.drop_all(engine)
one2many_create

(二)数据添加

方式1、直接对外键列进行赋值  

方式2、指定关联项

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine

from one_2_many_create import Favor,Person

engine = create_engine("mysql+pymysql://root@127.0.0.1:3306/chouti?charset=utf8")

Session = sessionmaker(bind=engine)
session = Session()

# 1、添加数据方式一:直接给外键列赋值
f1=Favor(caption='blue')
f2=Favor(caption='orange')
f3=Favor(caption='yellow')
p1=Person(name='lucy',favor_id=1)
p2=Person(name='jack',favor_id=3)
p3=Person(name='even',favor_id=2)
p4=Person(name='luna',favor_id=1)
session.add_all([f1,f2,f3,p1,p2,p3,p4])
session.commit()

# 2、添加数据方式二:指定关联
f2_1 = Favor(caption='white')
f2_2 = Favor(caption='black')
f2_3 = Favor(caption='pink')
p2_1 = Person(name='elen')
p2_2 = Person(name='leo')
p2_3 = Person(name='haha')
p2_4 = Person(name='lala')

f2_1.pers = [p2_1,p2_3]
f2_2.pers = [p2_2]
f2_3.pers = [p2_4]
session.add_all([f2_1,f2_2,f2_3,p2_1,p2_2,p2_3,p2_4])
session.commit()
add_item

注意:在已有数据中新添加数据,应该append,不能直接赋值,

# 在已有数据中新添加数据,应该append,不能直接赋值,
f = session.query(Favor).filter(Favor.caption=='blue').first()
print(f.pers)
p_new = Person(name='dodo')
f.pers.append(p_new)

session.add(f)
session.commit()
relationship_append

(三)数据查询

1、单表查询

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine

from one_2_many_create import Favor,Person

engine = create_engine("mysql+pymysql://root@127.0.0.1:3306/chouti?charset=utf8")

Session = sessionmaker(bind=engine)
session = Session()

# # 单表查询
# ret = session.query(Person).filter(Person.nid==4).first()
# print(ret.name)
query_filter

2、跨表查询,session().query().join()

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine

from one_2_many_create import Favor,Person

engine = create_engine("mysql+pymysql://root@127.0.0.1:3306/chouti?charset=utf8")

Session = sessionmaker(bind=engine)
session = Session()

# 跨表查询
# FROM person INNER JOIN favor ON favor.nid = person.favor_id
ret = session.query(Person.name,Favor.caption).join(Favor)
print(ret)
ret = session.query(Person.name,Favor.caption).join(Favor).all()
print(ret)

# FROM favor INNER JOIN person ON favor.nid = person.favor_id
ret = session.query(Favor.caption,Person.name).join(Person)
print(ret)
ret = session.query(Favor.caption,Person.name).join(Person).all()
print(ret)

# 为字段重命名 .lable("...")
ret = session.query(Favor.caption.label('kkk'),Person.name.label('ggg')).join(Person)
print(ret)
# SELECT favor.caption AS kkk, person.name AS ggg FROM favor INNER JOIN person ON favor.nid = person.favor_id
query_join

3、联表查询,relationship(),

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine

from one_2_many_create import Favor,Person

engine = create_engine("mysql+pymysql://root@127.0.0.1:3306/chouti?charset=utf8")

Session = sessionmaker(bind=engine)
session = Session()

# 联表查询
# 1、一查多,从表查主表
f1 = session.query(Favor).filter(Favor.caption=='blue').first()
print(f1)                   # 单表查询,返回Favor.__repr__()设置的返回值
print(f1.pers)              # 关联查询,返回符合条件的从表对象列表
for i in f1.pers:
    print(i.name)           # 提取从表对象中的具体字段信息
# 2、多查一,主表查从表
p1 = session.query(Person).filter(Person.name=='lucy').first()
print(p1)
print(p1.favor)
print(p1.name, p1.favor.caption)
relationship

  注意:

  (1)使用联表查询之前,需要在表类中创建relationship关联,指明关联字段

  (2)一查多,即从表查主表,获取具体字段信息时,需循环遍历,

  (3)多查一,即主表查从表,获取字段时可以直接使用,