tornado框架基础08-sqlalchemy表关系和简单登录注册
01 一对一表关系
Module
需要先创建对应的 Module ,这里采用之前建立好的 User 和 UserDetails
relationship
from sqlalchemy.orm import relationship
在 UserDetails 中添加如下代码:
userdetail = relationship('User',backref='details',uselist=False,cascade='all')
backref往User里面添加一个属性。
使用
rows = session.query(User).get(1)
rows.details #取到了用户的详细信息,UserDetails中的数据。
普通方法:session.query(UserDetails),filter(UserDetails.user_id==row.id).all()
自动添加属性
在刚才这里, User 里面本来是没有 details 这个属性的,但是在 UserDetails 里面添加 relationship 之后, User 实例会自动加上 details 属性
relationship
表关系是逻辑上的关系,但是 mysql 中并没有直接说明表关系的东西,外键约束是一个表现形式,外键是一种表之间的约束,可以用来表示这种关系
在SQLAlchemy里面,这个relationship代表了一对多的关系,当然我们可以通过参数改变关系,它默认是一对多的关系,而这个关系是SQLAlchemy里面的,和数据库没有关系,但是relationship是和外键一起使用的。
relationship**参数分解**
relationship('User', backref='details',uselist=False, cascade='all')
User 关联的 Module
backref 在对应的 Module 中添加属性
uselist 表示 一对多 关系, 如果是一对多关系,则不需要重新赋值,如果是一对一关系,则需要赋值为 **False
cascade 自动关系处理,就和 MySQL 中的 ON DELETE/ON UPDATE 类似
cascade
cascade 所有的可选字符串项是:
all , 所有操作都会自动处理到关联对象上.
save-update , 关联对象自动添加到会话.
delete , 关联对象自动从会话中删除.
delete-orphan , 属性中去掉关联对象, 则会话中会自动删除关联对象.
merge , session.merge() 时会处理关联对象.
refresh-expire , session.expire() 时会处理关联对象.
expunge , session.expunge() 时会处理关联对象.
User => User.details反向查询
ForeignKey
分辨正向查询和反向查询,主要看 ForeginKey在哪个 Module
使用一对多 relationship 默认是 一对多 关系
uselist
uselist=True,默认是 True ,因此可以省略不写
02 多对多关系
用户 和 文章之间,可以是一对多的关系,但是如果用户转载的话,就可以看成是 多对多 关系,那 多对多 关系在 SQLAlchemy 中怎么表示呢?
创建 Module
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) )
创建 Module
文章 Module
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)
#secondary的中间表对象名
def repr(self):
return 'Article(id=%s, content=%s, creat_time=%s)' % ( self.id, self.content, self.create_time )
03 包管理
当把 Module写好之后,该如何调用呢?
直接导入
在 模块中直接导入:
from data.user_modules import User
刚才看到,运行报错,这是为什么呢?
包概念:
把很多模块放到一个文件夹里面,就可以形成一个包
包管理:
当把很多模块放在文件中时,为了方便引用包中的模块,引入了包管理
__init**__.py:**
在包管理中,加入此模块,则包名可以直接通过属性访问的方式,访问此模块内的对象,此模块不加上可能不会报错,但是规范是要加上,文件内容可以为空
代码:print(dir(模块))
相对路径导入
在包管理中,可以通过 . (一个点) 和 .. (两个点)分别来导入同层和上一层的模块
相对路径导入

引入作用
在包中,如果包中模块要导入同一包中的其他模块,就必须使用此方法导入
使用方法:
from .module(..module) import obj (as new_name)
引入之后的影响
当一个模块中出现此导入方式(相对路径引入),则该模块不能被直接运行,只能被导入,被引用
04 简单的登录
Handler
class LoginHandler(tornado.web.RequestHandler):
def get(self):
self.render('01in_out.html')
def post(self, *args, kwargs):
user = self.get_argument('name', '')
username = User.by_name(user)
passwd = self.get_argument('password', '')
if username and passwd == username[0].password:
self.render('07login.html', username=username, )
else:
self.write('用户名或密码错误')
User.by_name
在 Module -> User 中添加如下方法:
@classmethod
def by_name(cls,name):
return session.query(cls).filter_by(username=name).all()
直接调用方法,不需要传入实例。
模板
{% if username%} 欢迎用户 {{ username[0].username }}
登录
{% else %} 您还没有登录
{% end %}
tornado框架基础08-sqlalchemy表关系和简单登录注册的更多相关文章
- tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册
tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册 引言 #在数据库,所谓表关系,只是人为认为的添加上去的表与表之间的关系,只是逻辑上认为的关系,实际上数据库里面的表之间 ...
- tornado框架基础06-SQLAlchemy连接数据库
01 ORM 在服务器后台,数据是要存储在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办呢?是不是需要把所有的 SQL 语句都再重新写一遍呢? 和数据库相关,不同的数据库需要 ...
- tornado框架基础10-websocket
websocket 01 长轮询 在网页,我们经常扫码登录,结合之前的学习的知识点,来思考下,前端是如何知道用户在手机上扫码登录了呢? 长轮询:客户端不断的向服务器发送请求 缺点: \1. 开销大 \ ...
- tornado框架基础11-tornado异步
01 同步和异步 生活中常常会遇到在超市排队买东西的情况,排在你前面的人没有结算完成,你就无法付账,在计算机中也有类似的情形,一个程序在执行之前,需要等待其他的程序执行完成,大家还能举出其他的例子吗? ...
- tornado框架基础09-cookie和session
01 cookie 在上节,我们简单了解了登录过程,但是很明显,每次都需要登录,但是在平常逛网站的只需要登录一次,那么网站是如何记录登录信息的呢? 有没有什么办法可以让浏览器记住登录信息,下次再次打开 ...
- tornado框架基础07-sqlalchemy查询
01 查询结果 上节使用query从数据库中查询到了结果,但是query返回的对象是直接可用的吗? 首先导入模块 from connect import session from user_modul ...
- tornado框架基础03-请求与响应
01 请求与响应 请求 浏览器在发送请求的时候,会发送具体的请求信息,由请求行,请求消息头,请求正文 请求消息头 向服务器传递附加信息 Accept: 浏览器可以接受的MIME类型. Accept-C ...
- tornado框架基础02-输入和输出
01 输出 write bytes类型 class IndexHandler(tornado.web.RequestHandler): def get(self): self.write(b'Torn ...
- tornado框架基础01-路由简介
tornado 小而精 Django 大而全 Web框架 Tornado是一个由Python开发的Web框架 Web服务 利用Tornado,可以快速搭建和一个高性能的Web服务 非阻塞 Tornad ...
随机推荐
- 第四篇 .NET高级技术之结构体及值类型引用类型
结构体 在平时的开发中很少自己去写结构体,他是一种值类型的数据.对于结构,不像类那样存在继承,一个结构体不能从另一个结构或类继承.但是结构体从基类Object继承. 语法: //struct是定义结构 ...
- loj125 除数函数求和 2
https://loj.ac/problem/125 $原式=2\sum_{i=1}^n(i^2*{\lfloor}{\frac{n}{i}}{\rfloor})+3\sum_{i=1}^n(i*{\ ...
- HDOJ 5475 An easy problem
题目传送门 题意:一个计算器,两种操作,乘上x,或者除掉之前的某个x,结果取模输出 分析:因为取模不支持除法,然后比赛时想到用逆元,结果发现MOD需要与b互质,结果一直苦苦寻找求逆元的其它方法.后来队 ...
- 18.3.2从Class上获取信息(内部类接口等)
内部类 接口.枚举.注释类型
- 解决Android 打包为apk文件时已设置签名,在OPPO手机上安装时却出现“未设置签名”的错误
解决办法:
- 【转】java节省内存的几条建议
下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方. 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单 ...
- f# mathprovider
http://mathprovider.codeplex.com/ http://mathnetnumerics.codeplex.com/releases/view/110750 http://py ...
- UVA 11419 SAM I AM (最小点覆盖,匈牙利算法)
题意:给一个r*c的矩阵,某些格子中可能有一些怪物,可以在一行或一列防止一枚大炮,大炮会扫光整行/列的怪,问最少需要多少炮?输出炮的位置. 思路: 先每行和列都放一个炮,把炮当成点,把怪当成边,一边连 ...
- 洛谷 P2788 数学1(math1)- 加减算式
题目背景 蒟蒻HansBug在数学考场上,挠了无数次的头,可脑子里还是一片空白. 题目描述 好不容易啊,HansBug终于熬到了做到数学最后一题的时刻了,眼前是一堆杂乱的加减算式.显然成功就在眼前了. ...
- Windows下使用python库 curses遇到错误消息的解决方案
在Windows系统下执行python应用时,有时会遇到错误信息: ModuleNotFoundError: No module named '_curses'. 然而查看Windows系统里pyth ...