zoukankan      html  css  js  c++  java
  • 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)

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

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

        

  • 相关阅读:
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale
    CodeForces 785B Anton and Classes
    CodeForces 785A Anton and Polyhedrons
    爱奇艺全国高校算法大赛初赛C
    爱奇艺全国高校算法大赛初赛B
    爱奇艺全国高校算法大赛初赛A
    EOJ 3265 七巧板
    EOJ 3256 拼音魔法
    EOJ 3262 黑心啤酒厂
  • 原文地址:https://www.cnblogs.com/bear905695019/p/8553199.html
Copyright © 2011-2022 走看看