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)
在包中,如果包中模块要导入同一包中的其他模块,就必须使用此方法导入
当一个模块中出现此导入方式,则该模块不能被直接运行,只能被导入