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表关系和简单登录注册的更多相关文章

  1. tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册

    tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册 引言 #在数据库,所谓表关系,只是人为认为的添加上去的表与表之间的关系,只是逻辑上认为的关系,实际上数据库里面的表之间 ...

  2. tornado框架基础06-SQLAlchemy连接数据库

    01 ORM 在服务器后台,数据是要存储在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办呢?是不是需要把所有的 SQL 语句都再重新写一遍呢? 和数据库相关,不同的数据库需要 ...

  3. tornado框架基础10-websocket

    websocket 01 长轮询 在网页,我们经常扫码登录,结合之前的学习的知识点,来思考下,前端是如何知道用户在手机上扫码登录了呢? 长轮询:客户端不断的向服务器发送请求 缺点: \1. 开销大 \ ...

  4. tornado框架基础11-tornado异步

    01 同步和异步 生活中常常会遇到在超市排队买东西的情况,排在你前面的人没有结算完成,你就无法付账,在计算机中也有类似的情形,一个程序在执行之前,需要等待其他的程序执行完成,大家还能举出其他的例子吗? ...

  5. tornado框架基础09-cookie和session

    01 cookie 在上节,我们简单了解了登录过程,但是很明显,每次都需要登录,但是在平常逛网站的只需要登录一次,那么网站是如何记录登录信息的呢? 有没有什么办法可以让浏览器记住登录信息,下次再次打开 ...

  6. tornado框架基础07-sqlalchemy查询

    01 查询结果 上节使用query从数据库中查询到了结果,但是query返回的对象是直接可用的吗? 首先导入模块 from connect import session from user_modul ...

  7. tornado框架基础03-请求与响应

    01 请求与响应 请求 浏览器在发送请求的时候,会发送具体的请求信息,由请求行,请求消息头,请求正文 请求消息头 向服务器传递附加信息 Accept: 浏览器可以接受的MIME类型. Accept-C ...

  8. tornado框架基础02-输入和输出

    01 输出 write bytes类型 class IndexHandler(tornado.web.RequestHandler): def get(self): self.write(b'Torn ...

  9. tornado框架基础01-路由简介

    tornado 小而精 Django 大而全 Web框架 Tornado是一个由Python开发的Web框架 Web服务 利用Tornado,可以快速搭建和一个高性能的Web服务 非阻塞 Tornad ...

随机推荐

  1. bug日志-天坑,Spring Security的登陆报错:An internal error occurred while trying to authenticate the user.

    在学习Spring Security的时候,我的编辑器给我报错:An internal error occurred while trying to authenticate the user. 明明 ...

  2. NSA互联网公开情报收集指南:迷宫中的秘密·上

    猫宁!!! 参考链接: https://www.nsa.gov/news-features/declassified-documents/assets/files/Untangling-the-Web ...

  3. Failed to convert property value of type 'java.util.LinkedHashMap' to required type 'java.util.Map' for property 'filters'

    在使用shiro的自定义filter出现的问题 <property name="filters"> <util:map> <entry key=&qu ...

  4. github最值得收藏的Bootstrap3后台管理框架

    1. AdminLTE AdminLTE是一个完全响应的后台管理模板.基于Bootstrap3框架.高度可定制,易于使用.适合许多屏幕分辨率从小型移动设备到大型台式机. GitHub AdminLTE ...

  5. C++ 的浅拷贝和深拷贝(结构体)

    关于浅拷贝和深拷贝这个问题遇上的次数不多,这次遇上整理一下,先说这样一个问题,关于浅拷贝的问题,先从最简单的说起. 假设存在一个结构体: struct Student { string name; i ...

  6. 网络流24题 一句话题解(updating)

      搭配飞行员问题   最简单的一道题 就是一个二分图匹配   太空飞行计划   最大权闭合子图 什么叫"最大权闭合子图"呢? 就是给定一个有向图,在里面选择一个点集,使得点集中的 ...

  7. 谷歌编码风格内容,新建一个xml文件,复制进去就可以在eclipse里面用了,命名--eclipse-java-google-style.xml

    <?xml version="1.0" encoding="UTF-8" standalone="no"?> <profi ...

  8. JAVA常用知识总结(三)——JAVA虚拟机

    先附一张JAVA虚拟机内存结构图: 其中JAVA虚拟机的线程问题<为什么JAVA虚拟机分为线程共享和非线程共享?>一文中已经有详细介绍,本文从面试中常问的一些JAVA虚拟机问题出发,主要从 ...

  9. toLocaleSting()

    之前一直忽略了这一方法,直到前天的笔试题,两种方式实现如下功能... 1234567890→1,234,567,890 当时我的思路是这样的:1.字符串反转,插入逗号,再反转 2.求余数,将字符串一分 ...

  10. 1051 - Good or Bad DFS 记忆化搜索

    http://lightoj.com/volume_showproblem.php?problem=1051 对于每个位置,设dfs(cur, one, two)表示前i个字母,拥有辅音字母one个, ...