谭子漪

一个理想主义者。

考了一场全国二级mysql & 无意义安利ruby

考试考完了。是那种计算机的社会考试,恶补一些以前疏忽的东西,顺便考个证的,考务费才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来做。

存储过程,存储函数么……天天写代码不就是在写函数吗!

评论
©谭子漪 | Powered by LOFTER