Tornado-Lesson08-1对N、多对多表关系,包管理

一、一对N表关系

  1.一对一表关系

    1)先建立对应的 Module

    2)relationship

      导人from sqlalchemy.orm import relationship

      在 UserDetails 中添加如下代码: userdetail = relationship('User',backref='details',uselist=False,cascade='all')

    3)调用方法

      反向查询

      from connect import session

      from user_module import User,

      UserDetails row = session.query(User).first()

      print(dir(row)) #可以看到多出来detail方法

      print(row.id)

      print(row.details) #对应user_detail表的数据

      正向查询

      row = session.query(UserDetails).first()

      print(row, dir(row))  #可以看到多出来userdetail方法

      print(row.userdetail) #对应user表的数据

    正向查询与反向查询取决于外键所在的表

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship

class UserDetails(Base):
    __tablename__ = 'user_details'
    id = Column(Integer, primary_key=True, autoincrement=True)
    id_card = Column(Integer, nullable=True, unique=True)
    lost_login = Column(DateTime)
    login_num = Column(Integer, default=0)
    user_id = Column(Integer, ForeignKey('user.id'))
    userdetail = relationship('User', backref='details', uselist=False, cascade='all')

    def __repr__(self):
        return '<UserDetails(id=%s,id_card=%s,lost_login=%s,login_num=%s,user_id=%s)>' %(
            self.id,
            self.id_card,
            self.lost_login,
            self.login_num,
            self.user_id
        )

 

  2.一对多表关系

    userdetail = relationship('User', backref='details', uselist=False, cascade='all')

    参数userlist 设置uselist=True,或者不写,则表示一对多表关系,默认一对多。

    注意: 

    #relationship()表示N对N的表关系,通过参数来指定一对多,多对多
    #relationship()中第一个参数'User'指对应的表Module的名字;
    #第二个参数backref表示可调用的方法名;
    #第三个参数默认表示一对多表关系,可以不写,设置uselist=False,表示一对一
    #第四个参数表示自动关系处理,类似mysql中的ON DELETE
    # cascade的参数都有:all,所有操作都会自动处理到关联对象上;
    # sava-update,关联对象自动添加到会话;
    # delete,关联对象自动从会话中删除;
    # delete-orphan,属性中去掉关联对象,则绘画中会自动删除关联对象;
    # merge,session.merge()时会处理关联对象;
    # refresh-expire,session.expire()时会处理关联对象;
    # expunge,session.expunge()时会处理关联对象
    #需要对关联的表有外键ForeignKey('user.id')
    #需要导包from sqlalchemy.orm import relationship

 

二、多对多表关系

    1)导包

   from sqlalchemy import Table

 

    2)创建中间表:

from sqlalchemy import Table

user_article = Table('user_article', Base.metadata,              Column('user_id', Integer, ForeignKey('user.id'),primary_key=True),              Column('article_id', Integer, ForeignKey('article.id'), primary_key=True) ) class Article(Base): __tablename__='article' id = Column(Integer, primary_key=True, autoincrement=True) content = Column(String(500), nullable=True) create_time = Column(DateTime, default=datetime.now()) article_user = relationship('User', backref='article', secondary='user_article') def __repr__(self): return 'Article(id=%s, content=%s, create_time=%s)' % ( self.id, self.content, self.create_time )

    3)使用

      row = session.query(User).first() 
      print(dir(row)) #可以看到添加了article方法
      print(row.article)

 

 

三、包管理

  1.包概念

    包含很多模块的文件夹,就是包

  2.包管理

    当把很多模块放在文件中时,为了方便引用包中的模块,引入了包管理

  3.__init__.py

    在包管理中,加入此模块,则包名可以直接通过属性访问的方式,访问此模块内的对象,此模块不加上可能不会报错,但是规范是要加上,文件内容可以为空

  4.相对路径导入

    在包管理中,可以通过 . (一个点) 和 .. (两个点)分别来导入同层和上一层的模块

    from .module(..module) import obj (as new_name)

    在包中,如果包中模块要导入同一包中的其他模块,就必须使用此方法导入

    当一个模块中出现此导入方式,则该模块不能被直接运行,只能被导入

    

 

posted @ 2018-03-19 02:46  17-王晶龙-58  阅读(206)  评论(0编辑  收藏  举报