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)

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

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

        

  • 相关阅读:
    saltstack配置管理之YAML(二)
    自动化运维之saltstack 简单用法(一)
    异常处理,枚举,泛型
    面向对象二
    面向对象
    python面向对象
    方法(函数),内存空间,数组
    for循环,while循环,do while循环
    if判断,switch语句
    运算符
  • 原文地址:https://www.cnblogs.com/bear905695019/p/8553199.html
Copyright © 2011-2022 走看看