【 一 】一对多关系  
  
 1.1 关系  
class  Hobby ( Base) : 
    __tablename__ =  'hobby' 
    id  =  Column( Integer,  primary_key= True ) 
    caption =  Column( String( 50 ) ,  default= '篮球' ) 
    def  __str__ ( self) : 
        return  self. caption
class  Person ( Base) : 
    __tablename__ =  'person' 
    nid =  Column( Integer,  primary_key= True ) 
    name =  Column( String( 32 ) ,  index= True ,  nullable= True ) 
    
    hobby_id =  Column( Integer,  ForeignKey( "hobby.id" ) )   
    
    
    hobby =  relationship( 'Hobby' ,  backref= 'pers' ) 
    def  __str__ ( self) : 
        return  self. name
    def  __repr__ ( self) : 
        return  self. name
  
from  models import  Person, Hobby
from  sqlalchemy import  create_engine
engine =  create_engine( 
    "mysql+pymysql://root:1234@127.0.0.1:3306/sqlalchemy001?charset=utf8" , 
    max_overflow= 0 ,   
    pool_size= 5 ,   
    pool_timeout= 30 ,   
    pool_recycle= - 1   
) 
from  sqlalchemy. orm import  Session
session= Session( engine) 
if  __name__ ==  '__main__' : 
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    hobby =  session. query( Hobby) . filter_by( id = 1 ) . first( ) 
    print ( hobby. caption) 
    print ( hobby. pers) 
  
 models.py  
from  sqlalchemy import  Column,  Integer,  String,  Text,  ForeignKey,  DateTime,  UniqueConstraint,  Index
import  datetime
from  sqlalchemy. orm import  DeclarativeBase,  relationship
class  Base ( DeclarativeBase) : 
    pass 
class  User ( Base) : 
    __tablename__ =  'user' 
    id  =  Column( Integer,  primary_key= True ,  autoincrement= True ) 
    
    name =  Column( String( 32 ) ,  index= True ,  nullable= False ) 
    
    email =  Column( String( 32 ) ,  unique= True ) 
    ctime =  Column( DateTime,  default= datetime. datetime. now) 
    extra =  Column( Text,  nullable= True ) 
    def  __repr__ ( self) : 
        return  f"<User(name= { self. name} , email= { self. email} )>"  
class  Hobby ( Base) : 
    __tablename__ =  'hobby' 
    id  =  Column( Integer,  primary_key= True ) 
    caption =  Column( String( 50 ) ,  default= '篮球' ) 
    def  __str__ ( self) : 
        return  self. caption
class  Person ( Base) : 
    __tablename__ =  'person' 
    nid =  Column( Integer,  primary_key= True ) 
    name =  Column( String( 32 ) ,  index= True ,  nullable= True ) 
    
    hobby_id =  Column( Integer,  ForeignKey( "hobby.id" ) )   
    
    
    hobby =  relationship( 'Hobby' ,  backref= 'pers' ) 
    def  __str__ ( self) : 
        return  self. name
    def  __repr__ ( self) : 
        return  self. name
if  __name__ ==  '__main__' : 
    from  sqlalchemy import  create_engine
    engine =  create_engine( 
        "mysql+pymysql://root:123123@127.0.0.1:3306/school?charset=utf8" , 
        max_overflow= 0 ,   
        pool_size= 5 ,   
        pool_timeout= 30 ,   
        pool_recycle= - 1   
    ) 
    
    Base. metadata. create_all( engine) 
    
    
  
from  models import  Person,  Hobby
from  sqlalchemy import  create_engine
engine =  create_engine( 
    "mysql+pymysql://root:123123@127.0.0.1:3306/school?charset=utf8" , 
    max_overflow= 0 ,   
    pool_size= 5 ,   
    pool_timeout= 30 ,   
    pool_recycle= - 1   
) 
from  sqlalchemy. orm import  Session
session =  Session( engine) 
res1 =  Hobby( caption= 'rapper' ) 
session. add( res1) 
person =  Person( name= 'jingyi' ,  hobby_id= 1 ) 
session. add( person) 
session. commit( ) 
session. close( ) 
person =  Person( name= 'jingyi' ,  hobby= Hobby( caption= '乒乓球' ) ) 
session. add( person) 
session. commit( ) 
hobby= session. query( Hobby) . filter_by( id = 1 ) . first( ) 
person =  Person( name= 'jing' ,  hobby= hobby) 
session. add( person) 
session. commit( ) 
person =  session. query( Person) . filter_by( nid= 1 ) . first( ) 
print ( person) 
print ( person. hobby_id) 
print ( person. hobby) 
hobby =  session. query( Hobby) . filter_by( id = 1 ) . first( ) 
print ( hobby. caption) 
print ( hobby. pers) 
  
 
 
 
 
 【 二 】多对多关系  
 
from  sqlalchemy import  Column,  Integer,  String,  Text,  ForeignKey,  DateTime,  UniqueConstraint,  Index,  Table
import  datetime
from  sqlalchemy. orm import  DeclarativeBase,  relationship
class  Base ( DeclarativeBase) : 
    pass 
association_table =  Table( 'user1_group_association' ,  Base. metadata, 
                          Column( 'user1_id' ,  Integer,  ForeignKey( 'user1.id' ) ) , 
                          Column( 'group_id' ,  Integer,  ForeignKey( 'group.id' ) ) , 
                          UniqueConstraint( 'user1_id' ,  'group_id' )   
                          ) 
class  User1 ( Base) : 
    __tablename__ =  'user1' 
    id  =  Column( Integer,  primary_key= True ) 
    name =  Column( String( 32 ) ,  index= True ,  nullable= False ) 
    groups =  relationship( "Group" ,  secondary= association_table,  backref= "users" ) 
class  Group ( Base) : 
    __tablename__ =  'group' 
    id  =  Column( Integer,  primary_key= True ) 
    name =  Column( String( 32 ) ,  index= True ,  nullable= False ) 
if  __name__ ==  '__main__' : 
    from  sqlalchemy import  create_engine
    engine =  create_engine( 
        "mysql+pymysql://root:123123@127.0.0.1:3306/school?charset=utf8" , 
        max_overflow= 0 ,   
        pool_size= 5 ,   
        pool_timeout= 30 ,   
        pool_recycle= - 1   
    ) 
    
    Base. metadata. create_all( engine) 
    
    
  
 
from  modelss import  User1,  Group
from  sqlalchemy import  create_engine
engine =  create_engine( 
    "mysql+pymysql://root:123123@127.0.0.1:3306/school?charset=utf8" , 
    max_overflow= 0 ,   
    pool_size= 5 ,   
    pool_timeout= 30 ,   
    pool_recycle= - 1   
) 
from  sqlalchemy. orm import  Session
session =  Session( engine) 
group1 =  Group( name= '5A风景区' ) 
group2 =  Group( name= '大清败家子慈溪' ) 
res1 =  User1( name= '刘亦菲' ) 
res2 =  User1( name= '赵敏' ) 
res1. groups. append( group1) 
res2. groups. append( group2) 
session. add_all( [ res1, res2] ) 
user =  session. query( User1) . filter ( User1. id  ==  3 ) . all ( ) [ 0 ] 
print ( user. name) 
print ( user. groups) 
session. commit( ) 
session. close( ) 
  
 
user =  session. query( User1) . filter ( User1. id  ==  2 ) . all ( ) [ 0 ] 
print ( user. name) 
print ( user. groups) 
group =  session. query( Group) . filter ( Group. id  ==  3 ) . all ( ) [ 0 ] 
print ( group. name) 
print ( group. users) 
  
 
 
 
user1 =  session. query( User1) . filter_by( id = 2 ) . first( ) 
if  user1 is  None : 
    print ( "用户不存在" ) 
else : 
    
    group_id =  2  
    
    group_to_add =  session. query( Group) . filter_by( id = group_id) . first( ) 
    if  group_to_add is  None : 
        print ( "组不存在" ) 
    else : 
        
        user1. groups. append( group_to_add) 
        
        session. commit( ) 
        print ( "关联已添加" ) 
        
    session. close( ) 
  
 
 filter[where]查询 写条件  
user1 =  session. query( User1) . where( User1. id  >=  2 ) 
user2 =  session. query( User1) . where( User1. id  >=  2 ) . all ( ) 
user3 =  session. query( User1) . filter ( User1. id  >=  2 ) . all ( ) 
group1 =  session. query( Group) . filter_by( name= '5A风景区' ) . first( ) 
print ( user1) 
print ( user2) 
print ( user3) 
print ( group1) 
  
 
 between  
res =  session. query( User1) . where( User1. id . between( 1 , 7 ) , User1. name ==  '刘亦菲' ) . all ( ) 
print ( res) 
  
 
 in  
res =  session. query( User1) . filter ( User1. id . in_( [ 1 , 2 , 7 ] ) ) . all ( ) 
print ( res) 
  
 
 ~非,除。。外  
res =  session. query( User1) . filter ( ~ User1. id . in_( [ 3 ,  4 ] ) , User1. name== '刘亦菲' ) . all ( ) 
print ( res) 
  
 二次筛选  
session. query( User1) . filter ( User1. id . in_( session. query( Group. id ) . filter_by( name= '刘亦菲' ) ) ) . all ( ) 
  
 and,or条件  
from  sqlalchemy import  and_,  or_
res1 =  session. query( User1) . filter ( and_( User1. id  >  1 ,  User1. name ==  '刘亦菲' ) ) . all ( ) 
res2 =  session. query( User1) . filter ( or_( User1. id  >=  3 ,  User1. name ==  '刘亦菲' ) ) . all ( ) 
print ( res1) 
print ( res2) 
  
 通配符,以小开头,不以小开头  
res1 =  session. query( User1) . filter ( User1. name. like( '小%' ) ) . all ( ) 
res2 =  session. query( User1) . filter ( ~ User1. name. like( '小%' ) ) . all ( ) 
res3 =  session. query( User1) . filter ( ~ User1. name. like( '小%' ) ) 
print ( res1) 
print ( res2) 
print ( res3)  
  
 限制,用于分页,区间  
res1 =  session. query( User1) [ 5 : 9 ] 
res2 =  session. query( User1) [ 0 : 4 ] 
print ( res1) 
print ( res2) 
  
 排序  
res =  session. query( User1) . order_by( User1. name. asc( ) ) . all ( ) 
print ( res) 
res =  session. query( User1) . order_by( User1. name. desc( ) ,  User1. id . asc( ) ) . all ( ) 
print ( res) 
  
 分组  
from  sqlalchemy. sql import  func
ret =  session. query( 
    
    func. max ( User1. id ) . label( 'max_id' ) , 
    func. sum ( User1. id ) . label( 'sum_id' ) , 
    func. min ( User1. id ) . label( 'min_id' ) , 
    User1. name
) . group_by( User1. name) . all ( ) 
user1 =  session. query( User1) . filter ( User1. name) 
print ( user1) 
for  row in  ret: 
    print ( row. max_id,  row. sum_id,  row. min_id,  row. name) 
  
 
 连表查询  
ret =  session. query( Person,  Hobby) . filter ( Person. hobby_id ==  Hobby. id ) . all ( ) 
print ( ret) 
ret1 =  session. query( Person) . join( Hobby,  Person. nid ==  Hobby. id ,  isouter= True ) 
print ( ret1)