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

引言

#在数据库,所谓表关系,只是人为认为的添加上去的表与表之间的关系,只是逻辑上认为的关系,实际上数据库里面的表之间并没有所谓的表关系

一、一对一表关系

  Module

#需要先创建对应的Module,这里采用之前建立好的User和UserDetails

relationship
from sqlalchemyorm import relationship #在Userdatails中添加如下代码:
userdetail = relationship('User',backref='details',uselist=False,cascade='all')#使用
row = session.query(User).get(1)
rows.details

  relationship

    userdetail = relationship('User',backref = 'details',uselist=False,cascade='all') #在使用relationship的时候上面必须要有ForeignKey
#类名 User,表示关联的Module
# 在子类中通过relationship里面的backref向父类User加上details这个属性
#uselist=False 代表relationship不再表示一对多关系了,表示一对一的关系了
#cascade表示自动关系处理,就和mysql中的ON DELETE 类似
#cascade所有的可选字符串项:1、all,所有操作都会自动处理到关联对象上;2、save_update,关联对象自动添加到会话;3、delete,关联对象自动从会话中删除;4、delete-orphan,属性中去掉关联对象,则会话中会自动删除关联对象;5、merge,session.merge()是会处理关联对象;6、refresh-expire,session.expire()时会处理关联对象;7、expunge,session.expunge()时会处理关联对象#自动添加属性
#在刚才这里,User里面本来是没有details这个属性的,但是在UserDetails里面添加relationship之后,User实例会自动添加上details属性#relationship
#表关系是逻辑关系,但是mysql中并没有直接说明表关系的东西,外键约束是一个表现形式,外键是一种表之间的约束,可以用来表示这种关系
#在SQLAlchemy里面,这个relationship代表了一对多的关系,当然我们可以通过参数改变关系,它默认为是一对多的关系,而这个关系是SQLAlchemy里面的,和数据库并没有什么关系,但是relationship是和外键一起使用的

#在relationship.py中输入一下代码from connect import session
from user_modules import User,UserDetailsrows = session.query(User).get(2) #获得id为2的数据信息
print(rows)
print(rows.username)
print(rows.details)rows = session.query(UserDetails).get(1)
print(rows)
print(rows.userdetail) #只要确定好一对一的关系,子类的userdetail和父类的details属性都可以得到对应的数据

二、多对多关系

#用户与服务器之间的关系可以看成是一对多的关系,但是用户转载的关系就可以看成是多对多的关系,如何在SQLAlchemy表示多对多的关系呢

#在user_modules.py里面添加,记得要导入Table模块
from sqlalchemy import Tableuser_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): #文章Module__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)#跟上面的区别在于没有uselist,secondary参数传入中间表def __repr__(self):return 'Article(id=%s,content=%s,create_time=%s)'%(self.id,self.content,self.create_time)

三、包管理

#把Module写好以后,该如何导入呢

#在模块中直接导入:
from data.user_modules import User #从data包下面的user_modules.py里面导入User

#这就会涉及到包管理#包的概念
#把很多模块放到一个文件夹里面,就可以形成一个包#包管理
#当把很多模块放在文件夹中的时候,为了方便引用包中的模块,引入包管理__init__.py
#在包管理中,加入此模块,则包名可以直接通过属性访问的方式,访问此模块内的对象,此模块不加上可能不会报错,但是规范是要加上,文件内容可以为空#相对路径导入
#在包管理中,可以通过.(一个点)和..(两个点)分别来导入同层和上一层的模块

#相对路径导入#引入作用
#在包中,如果包中模块要导入同一包中的其他模块,就必须使用此方法导入#使用方法
from .module(..module) import obj (as new_name)#引入以后的影响
#当一个模块中出现此导入方式,则该模块不能被直接运行,直接被导入

四、简单的登录

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define,options
import time
import util.ui_methods
import util.ui_modules
from data.user_modules import User #导入module包
define('port',default=8080,help = 'run port',type=int)
def haha():return 'this is hahahaah'class LoginHandler(tornado.web.RequestHandler):def get(self, *args, **kwargs):self.render('lesson2.html')def post(self, *args, **kwargs):user = self.get_arguments('name')password = self.get_argument('password','')username =User.by_name(user)if username and password == username[0].password:self.render('login_07.html',username = username)else:self.write('用户名或密码错误')application = tornado.web.Application(handlers=[(r'/login',LoginHandler),],template_path = 'templates',static_path= 'static',autoescape = None,ui_methods=util.ui_methods,ui_modules=util.ui_modules,debug=True)if __name__ == '__main__':tornado.options.parse_command_line()http_server = tornado.httpserver.HTTPServer(application)http_server.listen(options.port)tornado.ioloop.IOLoop.instance().start()

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="css/bootstrap.css"><style>* {margin: 0;padding: 0;}</style>
</head>
<body>{% if username %}欢迎用户{{ username }}登录<br><img src="{{ static_url('images/1.jpg')}}" width="250" height="250"><br>{% else %}您还没有登录{% end %}
</body>
</html>

#在user_module.py里面导入
from .connect import Base,session#在User类里面写入
    @classmethoddef by_name(cls,name):return  session.query(cls).filter(cls.username==name).all() #通过装饰器来获取类名

转载于:https://www.cnblogs.com/xuchengcheng1215/p/9028537.html

tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册相关推荐

  1. jsp oracle 登录页面,Oracle数据库之ORACLE+Myeclipse+jsp实现简单登录功能

    本文主要向大家介绍了Oracle数据库之ORACLE+Myeclipse+jsp实现简单登录功能,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. Oracle数据库表的建立: c ...

  2. java注册登录小程序,详解小程序之简单登录注册表单验证

    这段时间在做员工管理的小程序,前期在登录注册上花了不少功夫,今天就给大家分享下. 效果图,wxss的内容较简单,自己编写即可. ##主要内容 一.首先我是在util.js中引入表单正则验证规则,给予l ...

  3. sqlalchemy表关系之多对多

    sqlalchemy表之间的关系有三种:1.多对多  2.一对多  3.一对一 下面就讲讲sqlalchemy表之间如何建立多对多关系. 首先,我们把两个需要做多对多关系的模型定义出来,这里以Arct ...

  4. 数据库自学-多表关系和多表查询

    目录 1.多表关系 1.1一对多 1.2多对多 2.多表查询概述 笛卡尔积概述​编辑 多表查询分类 3. 内连接 1.隐式内连接 2.显式内连接 4.外连接 1.左外连接 2.右外连接 5.自连接 1 ...

  5. 小程序之简单登录注册表单验证

    这段时间在做员工管理的小程序,前期在登录注册上花了不少功夫,今天就给大家分享下. 效果图,wxss的内容较简单,自己编写即可. ##主要内容 一.首先我是在util.js中引入表单正则验证规则,给予l ...

  6. beego数据库orm操作数据表返回数组

    1.0 数据表模型(mode) func GetMyads(zoneid string) ([]orm.ParamsList, error) {tidNum, err := strconv.Parse ...

  7. tornado中数据库ORM操作(二):通过peewee-async集成到tornado中

    github地址:https://github.com/05bit/peewee-async Install Install with pip for PostgreSQL: pip install ...

  8. SAP中会计凭证数据表关系的简单验证

    近期在查找资料时浏览到一篇名为<FI中 BSEG簇表 和BSIS.BSAS.BSID.BSAD.BSIK.BSAK六个表的关系>的博文.了解到了一些自己以前并不清楚的知识.顺便也自行测试验 ...

  9. 【HTML/CSS】简单登录注册表单制作

    实现效果: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF- ...

最新文章

  1. js原生操作select、radio 、checkbox
  2. Redis(六):Set集合数据类型详解
  3. 华为服务器euleros系统,euleros服务器版本
  4. php方法参数,关于PHP方法参数的那一些事
  5. 二进制计量单位#K,M,G,T的换算
  6. 【Android -- 开源库】Gson 的基本使用
  7. win7工作组看不到“其他电脑”的解决方法
  8. 第一次遇到:TNS-12555: TNS:permission denied
  9. 《宣龙教育》加密网课视频下载
  10. Thinkpad E431 蓝牙连接问题
  11. hdu2907 凸包+简单搜索
  12. DNA: 人类的终极U盘
  13. 新学期|新气象,青春有为,不负韶华
  14. android 监听wifi的连接状态,Android判断wifi状态 监听wifi连接
  15. 累涨超200%成华尔街新宠 Fastly借边缘云有望冲上“云”霄?
  16. 【Unity3D读取数据】(一)Txt文档操作(创建、读取、写入、修改)
  17. 【Java基础】NoClassDefFoundError 和 ClassNotFoundException的定义及其区别
  18. 「州晖」固定支架、活动支吊架、抗震支架简介
  19. 软件技术共享社区正式上线
  20. Apple推出针对有缺陷的iPhone 8逻辑板的维修计划

热门文章

  1. 服务器主板装w7系统死机,解决win7安装过程死机现象有一招
  2. Python_堆栈和队列
  3. arcgis建立拓扑分析(检验矢量图)
  4. Git 分布式版本控制常用命令(1)
  5. Eclipse基金会
  6. 获取网址中参数的方式
  7. ubuntu 如何转换 ppk ,连接 amazon ec2
  8. 使用JXL组件操作Excel和导出文件
  9. 给asterisk写app供CLI调用
  10. 代码编写中会遇到的安全性问题