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="250" height="250">
        <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() #通过装饰器来获取类名

原文地址:https://www.cnblogs.com/xuchengcheng1215/p/9028537.html

时间: 2024-08-29 14:55:24

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

tornado 06 数据库 ORM

tornado 06 数据库-ORM-SQLAlchemy--基本内容及操作 一. ORM #在服务器后台,数据是要储存在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办?是不是需要把所有的SQL语句在重新写一遍呢? #用ORM隔离框架和数据库 tornado ------> ORM -------> 数据库 #ORM #全称:Object Relational Mapping 对象关系映射 #通过ORM可以不用关心后台是使用的哪种数据库,只需要按照ORM所提供的语法规

ORM SQLAlchemy 表于表的关系

1表与表之间三种关系 1.1 一对一关系 举例: 一个丈夫对应一个妻子,一个妻子对应一个丈夫 1.2 一对多关系 举例:一个人可以拥有多辆汽车,要求查询某个人拥有的所有车辆 分析:这种情况其实也可以采用 一张表,但因为一个人可以拥有多辆汽车,如果采用一张表,会造成冗余信息过多.好的设计方式是,人和车辆分别单独建表,那么如何将两个表关联呢?有个巧妙的方法,在车辆的表中加个外键字段(人的编号)即可. 1.3 多对多关系 例如:学生选课,一个学生可以选修多门课程,每门课程可供多个学生选择. 分析:这种

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

1.0 数据表模型(mode) func GetMyads(zoneid string) ([]orm.ParamsList, error) { tidNum, err := strconv.ParseInt(zoneid, 10, 32) if err != nil { return nil, err } //查询数据表 o := orm.NewOrm() var lsits []orm.ParamsList num, err := o.Raw("SELECT * FROM `oepre_my

Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册

动态验证:(不需要建Model模型) 1.建一个控制器,做表单操作(包含验证) <?php namespace Biaodan\Controller; use Think\Controller; class BiaodanController extends Controller { public function test() { if(empty($_POST))//如果$_POST空,显示添加页面, { $this->show(); } else //如果$_POST不为空,走验证,验证

Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册

说明:这里没练习静态自动验证:如果用到静态验证首先自定义一个控制器,再在Model文件夹里创建一个NiHaoModel.php 类  NiHao是自定义的,前缀可以随意,但是一定要用驼峰法(首字母大写) 在自定义控制器里用D()方法时里面要写入NiHaoModel.php 类的前缀 NiHao   因为有这串代码 protected $trueTableName = 'yonghu'; //作用是找到真实表名,系统默认找yong_hu这个表,需要定义此方法,才能找到yonghu表 <?php n

数据库表关系及配置

1.数据库表中的关系 一对一 一对多(多对一) 多对多 2.如何确立和实现数据库中的表关系 一对多的表关系实现: 使用外键约束 我们习惯把一的方称为主表,把多的方称为从表 外键:从表中有一列,除了null之外,只能来源于主表的主键 默认情况下,外键的字段是可以重复的 多对多的表关系在数据库中实现: 使用中间表 中间表有两个外键,引用两个多对多表的主键 不能有其它字段信息,至于中间表的主键,应该采用联合主键 任何一个多方表和中间表去比较都是一对多的关系 一对一的表关系再数据库中实现: 有两种: 1

Python与数据库[2] -&gt; 关系对象映射/ORM -&gt; 利用 sqlalchemy 实现关系表查询功能

利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例中用到的表主要有3张,一张personInfo个人信息表,一张account_store账号信息表,以及一张person_account_rel的个人信息与账号关系表. 示例中将会通过已知的人物年龄和id通过个人信息表查出个人姓名(仅为参考示例,请忽略怪异的查找逻辑 :) ),随后根据关系表得到的人

基础入门_Python-模块和包.深入SQLAlchemy之SQLAlchemy ORM重构表?

简单介绍: 说明: 此模块主要用于将关系型数据库表映射到PY的类,行映射到PY类的实例,列映射为PY实例的属性,由于其兼容众多DB-API及扩展,SO可以优先考虑数据模型,而忽略底层的DB-API切换,数据迁移更方便. 快速安装: pip install --upgrade SQLAlchemy 定义结构: #!/usr/bin/env python # -*- coding: utf-8 -*- """ # # Authors: limanman # OsChina: ht

Python中使用SQLAlchemy连接Mysql数据库(单表操作)

一,SQLAlchemy的安装 使用 $ easy_install sqlalchemy 或 $ pip install sqlalchemy 如果出现什么错,就进去root用户下进行安装试试,或者网上查查 >>> import sqlalchemy >>> 这样说明成功了,切记是小写哦 二,使用 理论我也不懂,自己查查资料,现在用一个小的案例说一下使用步骤 1,在进行数据操作之前要先连上数据库. >>> from sqlalchemy import