美文网首页
考了个试

考了个试

作者: 白练Draft | 来源:发表于2018-09-16 02:41 被阅读5次

    考试考完了。是那种计算机的社会考试,恶补一些以前疏忽的东西,顺便考个证的,考务费才105钱。整体感受是,虚惊一场……
    我从一开始就搞错课程了,本来应该考三级,名字是“数据库XX”,但是我决定考二级,叫“mysqlXXX“。数据库的范围更大一点,三级比两级也难。
    备考时间大概一个月吧,从买教材开始。不过mysql因为工作要用,增删改查是很熟的,但确实,我看了公司测试服的数据,就一个view,没有trigger,没有event,procedure,function……

    emm,谁跟我说来着的,java程序员喜欢什么事都用sql解决??

    以及要吐槽,昨天公司服务器神tm又被攻击了,把所有索引都拖走清空了,留了一句话,英文的,大意是,你还想要你的数据吗,还要的话赶紧给我0.05比特币!啊……虽然比特币现在是挺高的,但是第一次看到赎金不是整数的。

    接着说view,trigger,event,procedure,function。我原来用ror写程序的时候,除了表、索引,非空,默认值这些会弄一弄,视图?触发器?不存在的啦。

    比如要做一个视图,基于学生表,做一张男生表的视图。
    那只要在models文件夹下的student.rb里加一句就可以达到类似效果:

    scope :male_all, -> {where (['sex= ?','男'])}
    

    之后,如果是查询所有学生,使用Student.all,查询所有男生,使用Student.male_all
    还可以再连其他搜索条件比如:

    Student.male_all.where('age>?',10).order('studentNo desc).offset(0).limit(10)
    

    作为补充,来讲一下rails下是怎么做查询的。
    下面是sql主要的查询语句形式

    SELECT 查询列表 FROM 表
    【join_typeJOIN 表2 ON 连接条件
    WHERE 筛选条件
    GROUP BY 分组字段 HAVING 分组后筛选
    ORDER BY 排序字段
    LIMIT offset,size】;
    

    最粗暴的方式就是使用find_by_sql,把语句直接扔进去,就可以了。
    如果想要好好利用activerecord,那么用rails代码可以写出这样的东西:

    Student.select(name, sum(score)
        ).joins([:klass]
        ).where(klass.name='三年一班'
        ).group(name
        ).having(sum(score)>600
        ).order(sum(score) desc
        ).limit(0
        ​).offset(10)
    

    其中,如果一开始就要select筛选列,或者where筛选条件,或者使用定义的scope,那么.all就是不用写的。
    第二,joins是inner join,也就是交运算,而使用includes关键词的话则是left outer join。joins和includes是非常常用的两个关键字,前者会根据条件缩减行数,后者则不会缩减行数。
    第三,:class 是在model中已经预先配置好的关系,这些关系包括belongs_to, has_one, has_many, has_and_belongs_to_many。透过一个奇妙的through关键字还可以做到:
    student

        belongs_to :klass # 即在student表中有klass_id外键
    

    klass

        belongs_to :grade
        has_many :students
    

    grade

        has_many :klasses
    

    那么
    student

        has_one :grade, :through => :klass
    

    grade

        has_many :students, :through => :klass
    

    再来说trigger,rails在model里可以写一堆callback的东西,比如before_save, after_save, before_create, after_destroy等等。
    参考:https://www.jianshu.com/p/4cde0edc5899

    create触发的回调(按顺序)before_validation、after_validation、before_save、before_create、after_create、after_save
    update触发的回调 before_validation、after_validation、before_save、before_update、around_update、after_update、after_save
    destroy触发的回调 before_destroy、after_destroy
    touch触发的回调 after_touch

    至于event,同类的效果我在工作中用sidekiq来做。
    存储过程,存储函数么……天天写代码不就是在写函数吗!

    相关文章

      网友评论

          本文标题:考了个试

          本文链接:https://www.haomeiwen.com/subject/zgrxnftx.html