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