作者归档:隋辨

Python 利器之 SQLAlchemy

参考

请参考官方文档:sqlalchemy

SQLAlchemy 是什么

相当于 Java 的 Hibernate 和 Mybatis (我更喜欢MybatisPlus :),是 Python 里数一数二的 ORM框架。
ORM框架,本质上就是程序员懒得写 SQL 语句或者实体对象代码,于是让对象代码生成 SQL 语句或者让 SQL 语句生成对象,形成所谓的对象关系映射的程序框架(Object Relational Mapping)

初始化

初始化填好数据库信息,连接数据库,生成引擎,建立会话就好。当然它还可以连接内存数据库 sqlite 。
echo参数可以控制是否显示数据库操作细节。

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String

mysql_config = 'mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8' % (username, password, host, port, database_name)
engine = create_engine(mysql_config, echo=False)
Base = declarative_base()
DbSession = sessionmaker(bind=engine, expire_on_commit=False)
session = DbSession()

通过 declarative_base ,框架会处理你的类声明,自动将你的类与数据库表绑定。
如下:User 继承 Base 。

最好在类内声明数据类型。 primary_key 参数代表是否为主键。
tablename 为数据表表名。

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    password = Column(String)

增加

user1 = User(name='lihua', age=18)
session.add(user1)

user2 = User(name='hanmeimei', age=18)
user3 = User(name='songwenhua', age=18)

session.add_all([user1, user2])
session.commit()
# commit 才能提交更改

查找

过滤器有 filter_by 和 filter ,前者用于简单的查询。
filter_by 只支持 = 运算。
filter 支持 ==, >, < ,还支持 like, has, in_, or_, and_ 等自带操作。
查找后要加 all(), first(), 或者 limit() 。

session.query(User).filter_by(id=1).first()
# 代表第一个
# desc(): 降序
session.query(User).order_by(User.id.desc()).all()
# asc():升序
session.query(User).order_by(Users.name.desc(),User.id.asc()).all()

#  例子
query.filter(Address.user == someuser)
query.filter(Address.user != someuser)
query.filter(Address.user == None)
# 名称中包含
query.filter(User.addresses.contains(someaddress))
# 用于多对一关系
query.filter(User.addresses.any(Address.email_address == 'bar'))

删除

User.query.filter(User.id == 123).delete()
session.commit()

修改

只需要查找之后,修改对象的值,commit 就可以了。

p = session.query(ParamClass).filter_by(id=1).first()
p.k1 = k1
session.commit()

flush 和 commit区别

flush 只是将语句发送到数据库内存,这种改变在这个会话可以看见,其他会话则不然。
commit 会提交所有更改,存至磁盘,其他会话也能查询到这种更改。

如何动态绑定表

接下来是重头戏了,由于业务需求,我需要根据情况,将同一类型的对象,存储在不同的表,也就是将数据存多个表,这些表的列名和结构都一致。
Python 的一个特性是可以动态生成类,利用 type() 不仅可以判断数据类型,还可以生成类:

type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))

由于框架是根据tablename来绑定表的,而且类的tablename是无法改变的。
于是可以用字典在一开始就把表名和类相关联,Model 是存粹的数据模型,Base 是 declarative_base 而来。这样就可以根据情况来匹配类了。

class User():
    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    password = Column(String)

table_mapper_dict[table_name] = type(
    table_name,
    (Model, Base),
    {'__tablename__': table_name}
)

程序员的巴别塔问题

巴别塔问题,是圣经故事中,人类企图在示拿之地建塔,来传扬自己的名声,以免他们分散到世界各地。上帝知道之后,将他们的语言打乱,再把他们分散到世界各地。于是巴别塔停止修建,人类也因此发生冲突与战乱。

程序员有很多语言,不同的语言还有不同的代码框架和库。在程序员论坛,你基本上丢上一句「xxx是最好的语言」、「xxx吊打xxx」,热度马上就能上来。一些人乐于造轮子,说的是喜欢创造别人已经创造过的工具。大多数人在业务上重复造轮子,对自己来说可以锻炼代码能力,对别人来说通常是一种灾难,自己的轮子没有社区和团队的支持,没有详尽的文档解释,别人要理解代码完全就是头疼了。

每当看见一个新语言/新框架,我就会感慨,程序员怎么那么命苦。别人发明语言,发明框架,我们来学,又是一套新东西,无非是一些语言特性加加减减。有人就说,这个语言实现了xx特性,这样我们编码的速度/程序的性能/语言的易用性又提高了。程序语言不太可能出现什么革命性的升级,除非有一天自然语言处理技术已经能跟上人类的大脑,人们只需要说话就能写程序。别人出书,我们买书,别人演讲,我们学习,别人用新技术完成了kpi,我们下班继续学习。号称完成了xx特性,提高了多少效率,门槛如何如何低,结果就是大家依然要加班,但是加班的位置都更难抢了。十年前,你会写html,用ps切切图,还知道tomcat弄服务器,你就很牛了。现在招聘要求是,高并发、高可用、多线程编程、高性能分布式系统、容器技术。你工资没变高,但是你要学的东西变多了,你气不气,这大概就是技术革新吧。

普通人能为男女平权做些什么

女权运动似乎从来都只是网络上的小打小闹,或被恶化成田园女权被人误解,或被一些自媒体拿着当枪使,或是像李银河那样正经科普。对于普通人而言,还是能做点什么的。

如何理解男权社会?简化来说,不论各个国家的细节如何,都是私有财产出现之后,古代各国男性为了让自己的血脉继承财产,通过道德和制度剥夺了女方的经济能力,从而女性成为「第二性」。正是没有经济能力才使物化成为了可能,四川一些地方采茶业通常都是女性为主,在那更加平等,男人素有「耙耳朵」称号。

男权社会的不合理之处在于,不仅造成女权限制,还给男性带来巨大压力。不少男人会抱怨,女人现在的地位都那么高了,怎么还搞女权呢?男人的压力反而源于男权。男权社会在现代暴露出的逻辑,通常可以借由私有财产来解释,女性出生是父亲的私产,嫁人是丈夫的私产,其把女性当成了工具,而非目的。这样的私产不如男性作为人来的值钱,而且通常要花费很多钱,一次性卖出(彩礼)不值。因此在一些偏远地区,仍然有人打胎,希望来个男孩,仍然有人不停地生,为的是出一个男孩。即便自然状态女性出生率更高,我国男性还是比女性多出三千万。由于男性作为「第一性」,自然能赚钱、聪明、社会地位高成为了优秀品质,加上需求大于供给,女性自然要选择段位高的男性,男性也必须挤破头,所以说男人很难。接着贞操观就成了父权向买方市场讲的故事:一手货很好,二手是烂货,无形中抬高了价值。因为是私产,外在条件变得很重要,内在的品质却成为了附属品。作为将转接丈夫的私产,自然「听话、懂事、可爱」这些看上去顺从的品质列为上陈,因而「女汉子」常常不被舆论接纳。

上述的模型已经可以分辨百分之八十的不平等问题。普通人除了能分辨之外,还能改变自己的观念。作为男性,鄙视衣服言论,平等竞争,杜绝「女司机常出问题、女博士不好惹」的观念。作为女性,不利用自身性别「优势」谋取利益,自立自强不依赖他人。普通人不以贞操观评价好恶,杜绝荡妇羞辱,保持生男生女都一样的观念,不以性别决定公司人事去留,不以性别判断谁适合上学、谁适合学理科,塑造平权的家庭,不以强权剥削弱者。简单来说,男女本质上无差异的领域,不需要性别差异来决定,把人当成目的,而不是工具。

社会大多数认为是对的事情,常被视为真理。让男人女人,放弃各自的那些优势观念,当然是很难的。不管怎样,先做起来,心里埋下种子也可以。希望不再有被打掉的胎儿和不能上桌的儿媳,不再有为彩礼和处女膜沮丧的男性。

她从流水线,坐到了纽约办公室兼谈女权

我曾经听说过这样一个故事,一个农村女生,本来是在工厂打工,经过十年努力成为了纽约的一名程序员。

孙玲是湖南娄底的,跟我相当于老乡了,所以我看到这个故事的时候印象深刻。她是一个农村女生,09年高考完后分数没到二本线,一个郴州的计算机培训机构在他们学校做宣传,她参加了里面一个免费夏令营, 期间她开始感觉编程很美妙。但是因为家境贫困,高中毕业后,她去了深圳工厂里工作。

如果是你,觉得这个工作没什么前途,会怎么做?

她这个时候选择去打听培训机构,然后存了几个月钱,到10年,她在电子厂一边工作,一边学编程,为交学费还办了信用卡。终于在11年,她开始进入it行业,慢慢还信用卡,过上了坐在电脑前打字的生活。

如果是你,感觉自己现在生活很安稳,会怎么做?

她开始学习英语,意识到没有大学文凭也不太好找工作,想提升学历,到了12年,她换了份工资更高的工作,然后边学习英语,边上西安交通大学的远程教育课程。在14年她拿到了大专文凭后,又通过了深圳大学的专升本自考。下半年的时候,她加入了一个有很多外国人的飞盘俱乐部,对英语能力有很大提升。

如果是你,对自己的工作已经很满意了,会怎么选择?

她想出国看看,于是在网上找到了硕士留学项目,可以一边上学,一边工作。因为她刚好有了本科学历,刚好英语能力也提高了,2018年,终于她如愿以偿去美国读硕士,并且在纽约找到了工作。

09年,她高中毕业在电子厂打工,18年,她在纽约谷歌公司上班。其实她是一个普通人,她选择认认真真地做好了一件件小事,培训、考专科、考本科、学英语,就是这一件件小事,用十年时间累积起来,就造成了巨大的改变。不要高估一年的努力,也不要低估十年的坚持。

本来这个故事到这里已经结束了。但是我发觉,因为她是女性,她走的也许是一条更为艰难的道路。昨晚一个朋友告诉我,在他们村里,女性不能上桌吃饭。很多家庭都有好几个孩子,原因是他们会一直生育,直到有男孩为止,导致一家有很多姐妹。因为家庭经济负担不起,所以就让女孩去城里打工养家。更加离谱的是这样的习俗,如果老二是女孩,要么从小把她送人,要么就禁止她结婚。

很多人以为现在不是男权社会了,但事实不是这样。女性成功出生已经是万幸,然后在成长的路上还要被告知,女生的理科就是不行。女生只是空间想象力不如男生,但语言天赋却高于男生,高考里面数学的立体几何题、物理的很难想象的运动题,又占多少分呢?但常常是为了家里的弟弟继续学业,姐姐妹妹要放弃学业去打工。

类似的议题数不胜数。社会上受到性骚扰、性侵害的是不是常常是女性?在职场上,在学校里,在公共空间,是不是女上司、女博士、女司机常常占舆论劣势?结婚之后,是不是女方要受到的压力更大,要花更多时间陪孩子?离婚之后,是不是女性再婚更加困难?

有人会说,男性结婚要买车买房,还要送彩礼,比女性压力大得多。是的,男性如果占据更多优势,代价就是承担更多。当我们在以颜值和年龄度量女性的时候,同样就是在用金钱和权利来衡量男性的价值。这样的价值观下,男人要勤奋包揽一切事业,他不能哭,不能软弱。在那几千万光棍之中,又有多少在这些指标里毫无优势,然后孤独终老呢?男女就像一枚硬币的两面,哪一面朝上,社会的压路机压过来的时候,最开始遭殃的也是那面,最终我们都会陷入泥地。

反过来讲,只有掌握平衡之道,这枚硬币能够向前滚动,历史的车轮也不至于追赶上来,大家也就轻松得多。双方地位平等之后,女人可以不再把有车有房当成唯一标准,不再只盯着存款数额,男人也可以选择带孩子做饭,当个居家宅男。男人不介意当耙耳朵,女人也不会被叫做男人婆,从而二者的负担都能缓和。

不出意外的话,男男女女依然要在这样的社会生活很长时间,不是每个人都会有孙玲那样的幸运,但每个人都有那样的十年用来努力。最后,不论是男人女人,不要因为社会偏见而放弃自我,不要温和地走进那个良夜。

在家怎么高效学习工作

这次疫情看来让很多本不是自由职业者也实现了在家办公。除了圣人,没人可以一直保持闲散状态,所有人都想要空闲,前提是人们正在无休止的邮件和群消息里挣扎,为了deadline而通宵达旦,没有吃早餐的时间。

只有在你工作堆积如山时,你才可能享受闲暇。当你无事可做时,空闲就变得一点也不有趣,因为空闲就是你的工作,而且是最耗人的工作。闲懒和吻一样,当它被盗走了之后,它的味道才是甜的。—— 杰罗姆·K·杰罗姆

和一般想象不同,越是自由职业,越要保持内心的秩序,没有外部世界的打扰,唯一阻止你前进的只是你的情绪。要保持秩序,就要从生活规律开始。我们需要的是:

1、笼统的时间表

越是自由,越要学会约束自我,有人一开始上网就从一个链接跳转到另一个,一上午就过去了,一集接一集美剧,一下午又过去了。需要一张时间不精确,但任务明确的时间表,比如:

上午:背英语单词 30个 二十分钟背完 | 看新概念3课文 一篇 一个半小时

要能分割成具体的任务,大脑更加喜欢具体的、容易行动的「背单词」,而不是抽象的「学英语」。要明确数量要求,看书要看几页才完,任务完成到什么阶段才停止,只有确定之后才防止自己中途放弃。同时不要时间不要太精确,有些人一规划就是几点几分做什么,结果拉个肚子,错过了时间,导致后面时间都没用,就不想开始了,因小失大,我们是做的越多越好,而不是要完美地像个机器。

2、固定的活动区域

规定好区域功能,大脑会跟着引导走。在图书馆人们更容易进入学习状态,在办公室人们会更快地开始工作,环境里面的事物促进信息精细化编码,可以引导大脑进入之前的工作学习状态。规定床上只能睡觉,不能玩手机,规定卧室只能工作学习,客厅才能玩耍,这样会有仪式感。规划好自己区域的功能会极大提高启动效率。

3、运动必不可少

长期呆在家,肌肉会萎靡,新陈代谢下降,情绪也随着萎靡不振。许多自由职业者都会锻炼,有人甚至要在健身房大战两个小时。运动不仅是保持身体健康,运动后你会得到内心的平静与愉悦,这是内啡肽在体内舒缓情绪,同时也刺激神经元突触生长。这种对精神的刺激不是靠想象能得到的,规律运动,尤其是无氧运动,会让人有自信和活力。

4、日常的兴趣爱好

长期规律的兴趣,比如每晚看一个小时小说或者美剧,工作完后在App唱歌,有人还喜欢打扫卫生和整理房间。找到一个适合你自己routine,打游戏、冥想、运动、看电影、看vlog、读小说、听歌、和人聊天、上网吹水,只要你喜欢并让其成为日常,这样有规律的娱乐,配上有规律的工作更高效。

5、写日记

记录一天日常,总结和反思,一方面可以总结一天教训,日子会变得慢一点,一方面心理学有结论写日记时对自我感受和思考,会降低负面情绪,提高正向认知。

作为一个自由写作者,村上春树说过,要把自己融入节奏中去,把自己培养成一种习惯动物。于他而言,一天只有23小时,每天一定有一个小时跑步。写作五、六个小时,到上午十点为止。每天写十页,相当于每页四百字稿纸。到了八页写不下去时,也要写满十页,写好十页还想写时,不能继续写,只写十页,雷打不动。作家不会等待灵感从天而降,然后诉诸笔端,而是按照自己节奏,每天准时来上一发,让泉思跟得上笔头。一个自由职业者,一个闲在家的人士,反而更加需要像战士一样对自己严苛。

最后,在这样一个不能离开家门的日子里,你每天早上醒来看着最新感染人数,了解医学知识,跟着新闻跌宕起伏,心情也会偶尔消极吧,不如找点事做。肉体和精神需要同步,一个人只有忍受了平庸的日常,不至于陷入无意义的漩涡中,而那些娱乐才显得稍有价值。

新年随笔(2020)

2019年世界朝着固有的孤立态势前进,经济进入寒冬,2020年奇幻般以一颗导弹开局,再以病毒接续。

新年随笔(2018)

如何辞去你的2016

回顾前面几年的记忆,这让人不禁想问:究竟是世界越来越频发出现黑天鹅了,还是我更加关注世界了?

All is well.

看过《三傻》的人大概都会记住这句,一切都会好起来的,因为一切都会过去。因为还有明天,就还会有希望。2003年的非典,启发了刘强东做出了互联网电商,2020年,谁又知道会不会出现新机遇,头条系又会不会成为中国的Netflix呢?没有谁是未来学家,但只有相信明天,才有可能见到明天。每年的这个时候,我都不知道应该抱着怎样的心情去迎接新的一天,人们说的不错,时间是连续的,明天再特殊无非是一个时间段的重复,但窗外不断涌现的烟花,很难让人去不抱以一种崭新的心情。

每过一年,就越发觉得祝福的宝贵,越发觉得朋友的重要,《布鲁克林荒唐事》里面说:一个人只要有胆识拒绝社会要他干的事情,他便可以过上按自己意愿过的生活。

就祝愿我们都有相应的智慧与勇气,去拥有那样的自由。