Python数据库ORM SQLAlchemy 0.7学习笔记(4) 添加对象

1. 添加一个新对象

前面介绍了映射到实体表的映射类 User ,如果我们想将其持久化(Persist),那么就需要将这个由 User 类建立的对象实例添加到我们先前创建的Session会话实例中:

ed_user = User('ed', 'Ed Jones', 'edspassword')
session.add(ed_user)

上面两段代码执行完后对象持久化了么?你或许会兴冲冲的跑去数据库里查看,结果却失望而归——数据库里什么都没有。为什么呢?因为SQLAlchemy采取的是Lazyload策略,也就是说现在这个对象被标记为Pending准备状态,但没有执行任何可能导致数据库变化的SQL语句。那么什么时候会执行SQL语句并真正持久化呢?这个要等SQLAlchemy觉得需要的时候,比如我们现在查询这个对象、对象的一个属性或者显式的调用 flush 方法,这时候SQLAlchemy觉得它“是时候”或者“不得不”执行SQL数据库查询以便于把标记为Pending的数据写入数据库表中了。假如这时候你执行的获取对象、对象属性或者类似的操作,SQLAlchemy在执行完SQL语句后会将你所要查询的数据反馈给你。

Posted in:
  • 网络编程与数据库
  • Web开发及相关
Tagged
  • 数据库
  • 学习笔记
  • python
  • ORM
  • SQLAlchemy

Python数据库ORM SQLAlchemy 0.7学习笔记(3) 会话

1. 创建映射类的实例(Instance)

前面介绍了如何将数据库实体表映射到Python类上,下面我们可以创建这个类的一个实例(Instance),我们还是以前一篇文章的User类为例,让我们创建User对象:

>>> ed_user = User('ed', 'Ed Jones', 'edspassword')
>>> ed_user.name
'ed'
>>> ed_user.password
'edspassword'
>>> str(ed_user.id)
'None'

和普通的Python类一样实例化,大家可能会问为什么 ed_user.id 会是 None 值,首先 id 这个属性没有通过 __init__() 构造方法初始化,所以默认会因为先前定义的ORM的id列(Column)而产生一个 None 值,在默认情况下,ORM会为所有被映射的表列创建类属性,这些属性是通过Python语言中 描述符(Descriptors) 机制来实现的。所以这些属性的使用会包含一些额外的行为,包括跟踪修改,或者当需要时自动从数据库加载新的数据,也就是说我们在使用这些属性时,包括修改或者读取,都会触发ORM内部的一系列动作。

Posted in:
  • 网络编程与数据库
  • Web开发及相关
Tagged
  • 数据库
  • 学习笔记
  • python
  • ORM
  • SQLAlchemy

Python数据库ORM SQLAlchemy 0.7学习笔记(2) 定义映射

昨天简单介绍了SQLAlchemy的使用,但是没有能够涉及其最精彩的ORM部分,今天我将简单说明一下,当然主要还是讲解官方文档的内容,由于是学习笔记,有可能存在精简或者自己理解的部分,不做权威依据。

当我们开始使用ORM,一种可配置的结构可以用于描述我们的数据库表,稍后我们定义的类将会被映射到这些表上。当然现代的SQLAlchemy(新版本SQLAlchemy,原文是modern SQLAlchemy)使用 Declarative 把这两件事一起做了,即允许我们把创建类和描述定义数据库表以及它们之间的映射关系一次搞定。

这段话是什么意思呢?简单来说吧,SQLAlchemy分为Classic (经典模式)和Modern (现代模式),Classic定义数据库表的模式比较传统,需要先描述这个表。

1. Classic 映射

比如以官方文档中的例子,我们拥有表结构如下:

CREATE TABLE [users] (
  [id]       INTEGER PRIMARY KEY,
  [name]     TEXT NOT NULL,
  [fullname] TEXT NOT NULL,
  [password] TEXT NOT NULL
);
Posted in:
  • 网络编程与数据库
  • Web开发及相关
Tagged
  • 数据库
  • 学习笔记
  • python
  • ORM
  • SQLAlchemy

西数MyBook Live网络存储(NAS)配置BT/PT下载备忘

之前我写过一篇介绍配置电驴下载的文章,本来用着好好的,结果某天MyBookLive提示升级,然后我手贱点了升级,结果除了官方界面做的配置其他的配置被重置了,原来安装的软件全部没有了,白辛苦了,幸好还没有配置源代码管理系统,不过趁着这次重置,我准备体验一下BT/PT的下载。

上网搜索了一下,发现BT/PT下载配置比电驴下载配置容易多了,参考这篇文章 《Install Mybook Live Feature Pack Manager》 ,首先依旧是启用SSH,这个可以参考前面那篇文章,然后利用 PuTTY 连接你的My Book Live,安装Feature pack manager,将下面的命令输入并回车确认:

Posted in:
  • 计算机应用及维护
  • Unix/Linux/BSD系统
Tagged
  • 网络存储
  • BT/PT下载

Python数据库ORM SQLAlchemy 0.7学习笔记(1) 概要

最近正好在寻求一种Python的数据库ORM (Object Relational Mapper),SQLAlchemy ( 项目主页 )这个开源项目进入了我的视线,本来想尝试着使用Django的ORM模块的,无奈Django的模块联系比较紧密,没能单独分拆下来,一定程度上说明Django自成体系的生态系统在给我们带来快速便捷的开发环境的同时牺牲了组装的灵活性。

初次学习,也没实质感觉到SQLAlchemy的好处,不过看其介绍的 很多大公司均采用该项目 ,而且其 支持的数据库还是蛮丰富的 ,所以我觉得花点时间研究还是值得的。不过令人遗憾的是关于SQLAlchemy的中文资料比较少,所以对于我们这种英语不佳的带来了一定的麻烦。

研究一个项目最好的办法就是阅读其官方提供的说明文档,当然很轻松就找到了 SQLAlchemy的文档 (0.7) 。文档的格式和大多数项目一样,有下载安装说明,有示例,有快速上手教程。不过我还是习惯 下载个PDF慢慢研究

下面就将我近期的阅读学习做个笔记,当然这个仅供参考,里面可能有自己的一些猜测和想法, 不作权威依据 ,不当之处还希望指出。

Posted in:
  • 网络编程与数据库
  • Web开发及相关
Tagged
  • 数据库
  • 学习笔记
  • python
  • ORM
  • SQLAlchemy

ASP/VBScript动态创建属性对象的工厂类(DynamicObject)

最近整理ASP/VBScript代码,发现过去的一个ASP实现的MVC框架,可惜是个半成品,效率也成问题,不过发现里面有些我写的代码,感觉还稍稍可以拿出来见人,于是今天作此文以记之。

说是ASP,其实和VBScript也脱不了干系,VBScript语言传承于Visual Basic,VB的语法灵活度已经不尽如人意了,VBS作为其子集可想而知。神马反射、自省等先进的技术,微软在.NET中才引入。作为被抛弃的技术,也不奢望微软能够提供支持,于是顽固守旧的程序员只有绞尽脑汁的去模仿实现一些类似的功能。

好吧,我承认很长一段时间我就是顽固守旧派中的一员,今天介绍的就是其中的一项功能,动态创建一个属性对象,属性对象姑且这么称呼,也就是说动态创建的对象只包含属性(Properties)。

Posted in:
  • 网络编程与数据库
  • VBScript/JavaScript/Python
  • Web开发及相关
  • 系统应用程序开发
Tagged
  • asp
  • 设计模式
  • vbscript

收到Gmail的可疑登录警告邮件(Suspicious sign in prevented)

今天收到了一封来自Google标题为可疑登录阻止的邮件(Suspicious sign in prevented),心里一惊,想不会有人这么无聊吧,于是打开邮件,邮件意思是有人利用程序尝试多次登录我的邮件账户,然后给出了登录的细节,一看IP地址来自qq.com,联想到我这个Gmail是由qq邮箱代收的,顿时松了一口气,估计是QQ邮箱代收系统抽风了吧,但是从另一个层面讲,Google的这次提醒非常贴心,特别是邮件通知给出了解决的方案,并提示立即修改密码。而且在我登录到Gmail的时候顶部也以红色警告条提示邮箱被尝试可疑登录,给出了解决的步骤,顿时觉得Gmail的安全不是盖的。

Posted in:
  • 我的生活点滴
Tagged
  • 网络安全
  • Gmail
  • Google

ASP/JScript将字典对象(Scripting.Dictionary)存储到Application

最近要改进一个旧项目,项目采用ASP(JScript)编写,由于时间问题一直没有重构,所以还是ASP将就着,考虑到效率问题,准备把部分内容缓存起来,当然直接读写Application缓存不是很妥当的,遂采取缓存字典对象( Scripting.Dictionary )来实现。好了,一般会认为代码如下所示:

var key = "dict_cache"
var obj = Server.CreateObject("Scripting.Dictionary");

Application.Lock();
Application.Contents(key) = obj;
Application.Unlock();

偏偏事与愿违,如果你这样做的话,IIS会报“ 不允许的对象使用方式 ”错误,具体内容如下:

Application 对象 错误 'ASP 0197 : 80004005' 

不允许的对象使用方式 

/index.asp,行 12 

不能将具有单元模型行为的对象添加到应用程序的内部对象中。
Posted in:
  • 网络编程与数据库
  • Web开发及相关
Tagged
  • asp
  • javascript
  • dictionary字典

利用软件安全漏洞巧设陷阱获取数据库用户名和密码

今天客户要求维护某信息管理系统的数据,该软件缺少相应功能,所以需要直接进入数据库系统,然后使用SQL语句进行维护。

但是该软件默认未提供连接数据库的用户名、密码和数据库名称,翻了下程序目录下的配置文件,找到了登录用户名sa以及数据库名称,但是密码却是一串奇怪的字符,看情况是被加密过了,现在要获取这个密码。

我分别尝试了好几种办法,比如使用sniffer嗅探软件,探测发送到数据库的数据包,使用编程的方式建立个假的数据库服务陷阱,但均告失败。sniffer只能探测经过网卡的数据,对于localhost本地流量一点反应都没有,至于服务陷阱,我使用Python简单写了个接收端口数据并输出的程序作为陷阱:

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 8000)) # 端口为8000
sock.listen(5)

while True:
    conn,addr = sock.accept()
    try:
        conn.settimeout(5)
        buf = conn.recv(1024)
        print(buf)
    except socket.timeout:
        print('Time out')
    conn.close()
Posted in:
  • 计算机应用及维护
  • Windows系统
Tagged
  • 数据库
  • 网络安全

谁正在绑架用户的习惯

现在的软件我已经无力吐槽了,今天有客户的电脑装了某软件,然后被附带的下载了N多不需要的重复功能的软件,蚕食了用户电脑的资源,导致电脑越来越慢,即使熟悉计算机的老手不仔细看,一个眼花,也会中招。

我还记得3721那个时代,很多插件喜欢耍流氓,嵌入到用户需要的软件中,然后在这些软件的安装过程中偷偷安装自身,然后抢占用户电脑,再搞个无法卸载,然后就有了各种各样的反流氓软件程序、各种各样的联盟、行业自律协会,后来扳倒了3721这个流氓的头头,于是后来流氓软件们安静了,大家也不再担心被偷偷安装软件了。

事情到这里似乎很完美了,但是一切为了利益,有些软件开始偷偷的使用“被选择”的方式来诱导用户安装所不需要的软件,比如安装某个步骤中默认勾选附带软件,然后大家又稀里糊涂的装上了一堆软件,当然也不能说这些软件是流氓软件,至少他们是可以正常卸载的,不过这种安装方式有些流氓了。至于安不安装应该交由用户选择,而不是默认勾选为安装,好吧,有人要说了,我们做软件的不容易那,特别是免费软件,也要获利那,用户那种下一步下一步到底的安装模式哪里会注意这些捆绑的软件呢,用户注不注意是一回事,也不能利用用户的一步到底的安装习惯来绑架用户安装一堆软件吧。

Posted in:
  • 软件推荐及相关资讯
Tagged
  • 用户体验
  • 感想

© Wang Ye / 王 晔. All rights reserved.