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

二、多对多表关系

1)导包

   from sqlalchemy import Table

2)创建中间表:

from sqlalchemy import Table<br /><br />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() <br />      print(dir(row)) #可以看到添加了article方法<br />      print(row.article)

三、包管理

1.包概念

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

2.包管理

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

3.__init__.py

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

4.相对路径导入

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

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

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

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

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

相关推荐