tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册
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,UserDetails rows = 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 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): #文章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="" height="">
<br>
{% else %}
您还没有登录
{% end %}
</body>
</html>
#在user_module.py里面导入
from .connect import Base,session #在User类里面写入
@classmethod
def by_name(cls,name):
return session.query(cls).filter(cls.username==name).all() #通过装饰器来获取类名
tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册的更多相关文章
- tornado框架基础08-sqlalchemy表关系和简单登录注册
01 一对一表关系 Module 需要先创建对应的 Module ,这里采用之前建立好的 User 和 UserDetails relationship from sqlalchemy.orm imp ...
- tornado 06 数据库—ORM—SQLAlchemy——基本内容及操作
tornado 06 数据库—ORM—SQLAlchemy——基本内容及操作 一. ORM #在服务器后台,数据是要储存在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办?是不 ...
- tornado 07 数据库—ORM—SQLAlchemy—查询
tornado 07 数据库—ORM—SQLAlchemy—查询 引言 #上节课使用query从数据库查询到了结果,但是query返回的对象是直接可用的吗 #在query.py内输入一下内容 from ...
- ORM SQLAlchemy 表于表的关系
1表与表之间三种关系 1.1 一对一关系 举例: 一个丈夫对应一个妻子,一个妻子对应一个丈夫 1.2 一对多关系 举例:一个人可以拥有多辆汽车,要求查询某个人拥有的所有车辆 分析:这种情况其实也可以采 ...
- Django中ORM创建表关系
一:django中ORM创建表关系 ORM创建外键关系 1.表与表之间的关系 1.表与表之间的关系 一对多 一对一 多对多 2.操作目标条件: 图书表 出版社表 作者表 作者详情表 3.外键关联 一对 ...
- Django之ORM多表关系创建
ORM模型多表逻辑创建: 以图书和作者关系模型为例: models.py from django.db import models ''' 一本书只能被一个出版社出版; 一个出版社可以出版多本书; 一 ...
- DRF的orm多表关系补充及serializer子序列化
目录 一.控制多表关系的字段属性 1.如何建立基表 2.断开连表关系 3.四种级联关系 二.子序列化 一.控制多表关系的字段属性 1.如何建立基表 要在基表中配置Meta,设置abstract=Tru ...
- sqlalchemy的数据库ORM操作(表之间的关系)
首先导入一些需要的东东 ,我是在flask中写的,也可以用纯python去写. from flask import Flask from sqlalchemy import create_engine ...
- ORM SQLAlchemy - 基本关系模式
1 一对多 一个parent对多个child,一对多关系添加一个外键到child表,用于保存对应parent.id的值,引用parent.relationship()在parent中指定,引用/保存 ...
随机推荐
- java Web EL表达式详解
1.EL表达式的简介 EL表达式是一种JSP技术,能够代替JSP中原本要用Java语言进行显示的语句,使得代码更容易编写与维护.最基本的语法是${express}. 2.获取并显示数据 从四个域中通过 ...
- Web项目开发性能优化解决方案
web开发性能优化---安全篇 1.ip验证 2.操作日志.安全日志.登录日志 3.SQL注入校验 4.权限管理 5.验证规范(前端.后端.数据库约束) 2014-10-29 08:04 2773 ...
- linux加入windows域之完美方案
运行setup工具 认证配置 选择: “use winbind” “use kerberos” “use winbind authertication” 改为: 删除admin server 其余的改 ...
- codeforce467DIV2——D. Sleepy Game
分析 这个题乍一看有点像之前在CF上做过的一道DP,也是两个人下棋,但是写着写着觉得不对···这个题是的最优策略只是player 1 如果有环则是draw,可以DFS的时候顺便判环(拓扑排序的方法), ...
- zend studio在线安装svn的插件
这个,其实真的很简单 ,但是让我纠结了很久. 安装步骤: 1.确保电脑能够上网: 2.打开zend studio,然后选择help->welcome会弹出一个欢迎页面; 3.等待几秒后可以看到右 ...
- 在Ubuntu安装Tomcat7.0及开机自动运行
在Ubuntu安装Tomcat7.0及开机自动运行 1.安装装Tomcat7.0 一般都是绿色版的,下载一个tomcat7.0解开到指定的目录上即可 然后进入tomcat目录的bin文件夹,执行 su ...
- Luogu 4284 [SHOI2014]概率充电器
BZOJ 3566 树形$dp$ + 概率期望. 每一个点的贡献都是$1$,在本题中期望就等于概率. 发现每一个点要通电会在下面三件事中至少发生一件: 1.它自己通电了. 2.它的父亲给它通电了. 3 ...
- bootstrap实现嵌套列
<!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 嵌套列</title> <li ...
- 关于instanceof测试遇到的问题
今天上上课 用 instanceof关键字来判断某个对象是否属于某种数据类型.报错 代码如下 package cn.lijun.demo3; import cn.lijun.demo.Person; ...
- 如何偷Android的内存-Tricking Android MemoryFile
之前在做一个内存优化的时候,使用到了MemoryFile,由此发现了MemoryFile的一些特性以及一个非常trickly的使用方法,因此在这里记录一下 What is it MemoryFile是 ...