站点上的数据,存在数据库里。

一般用Mysql,也实用sqlite,Postgre。操作数据库要会SQL语言,这个有点麻烦,经常须要查手冊。

此外。每家数据库在实现SQL语言的时候,经常会加料,添加一些自己独有的东西。并且,SQL语言不是面向对象/基于对象,非常多抽象更高的东西不能使用。





于是。ORM就出现了。





ORM是Object Relation Model,也就是 对象关系映射。简而言之。ORM将将数据库的记录表示成对象。选择一个好的ORM。由它的层面解决数据库和SQL语言问题,能够非常开心。程序里用ORM优点多多,不须要写SQL语言了,更换新数据库仅仅须要改动配置,不用对代码做大改,在不同的OS上迁移也easy。

假如要处理特殊字符或者国际化字符,用ORM比SQL语言方便得多,特殊字符和国际化字符是个噩梦,做过的人都知道!

ORM的对象还能够实现很多其它特性,诸如类的继承和组合。





各种ORM框架太多了。Java的ORM框架出名的有十几个。Python的大点开源项目往往自己实现一个ORM框架,比方Django。





我个人推荐SQLAlchemy。优点是支持的数据库多。开发的年头久,版本号比較稳定,也有几家出名的站点用。如Yelp,reddit,openstack,dropbox。





能够通过pip安装。也能够下载源码解压缩。然后以setup的方式安装。

至于使用方式,本文仅仅能给一个极为简单的样例,SQLAlchemy的文档有一千多页。用的时候查查文档吧。

SQLAlchemy的演示样例代码dborm.py,内容例如以下:

---------------------------------------

#!/usr/bin/env python

#!-*- coding:utf-8 -*-





import sqlalchemy

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy import Column, Integer, String, Float

from sqlalchemy.orm import sessionmaker





Base = declarative_base()





class ShopPos(Base):

    __tablename__ = "ShopPosTable"

    shopid = Column(String(100), primary_key=True)

    lng = Column(Float)

    lat = Column(Float)





    def __repr__(self):

        return("<ShopPosTable(shopid='%s', lng='%s', lat='%s')>" %(self.shopid, 

self.lng, self.lat))





engine = sqlalchemy.create_engine(

    "mysql://dbuser1:dbpasswd1@localhost:3306/dbname1?charset=utf8",

    encoding="utf-8", 

    echo=False)





Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)

orm_session = Session()





if __name__ == "__main__":

    for i in orm_session.query(ShopPos).all():

        print i

---------------------------------------





在运行这个py文件之前,主机须要安装mysql,并创建名称是dbname1的database,创建数据库用户dbuser1。passworddbpasswd1,它有本地登录mysql的权限。在dbname1里。有一张表叫ShopPosTable,它有3个字段,记录餐厅的经纬度值,主键是餐厅shopid,里面填写几个測试记录。这个py文件看起来蛮多的,事实上大部分内容都是固定格式,真正要实现的就是类ShopPos。





这条语句,是从ShopPos表里把全部的记录取出来。然后打印显示。

    for i in orm_session.query(ShopPos).all(): print i





数据库操作的crud。也就是增查改删。也都是依照类似的方式来。





有了SQLAlchemy之后。就能够将前面几个Spider抓取到到的内容。存到mysql数据库里。

假设做分布式抓取。就不须要用SQLAlchemy,能够直接在S3上存储,或者用公网ip开一个Hadoop集群。装上HBase存数据,又快又好,再也不用操心容量和速度问题,这就是另外一个话题了。

一个站点的诞生06-- ORM的更多相关文章

  1. 一个站点的诞生02--用Scrapy抓取数据

    假设想抓数据,就须要有爬虫程序,业内叫crawler或者spider. 有各种语言版本号的开源爬虫.c++, Java,  php,在github上搜一下,以"spider c++" ...

  2. Django框架06 /orm多表操作

    Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ...

  3. MVC利用Routing实现多域名绑定一个站点、二级域名以及二级域名注册Area

    最近有这么个需求:在一个站点上绑定多个域名,每个域名进去后都要进入不同的页面.实现了这个功能以后,对于有多个域名,且有虚拟空间,但是虚拟空间却只匹配有一个站点的用户来说,可以节省很多小钱钱. 很久以前 ...

  4. Nginx技巧:灵活的server_name,Nginx配置一个服务器多个站点 和 一个站点多个二级域名

    http://www.cnblogs.com/buffer/archive/2011/08/17/2143514.html Nginx强大的正则表达式支持,可以使server_name的配置变得很灵活 ...

  5. APACHE如何里一个站点绑定多个域名?用ServerAlias

    APACHE2如何里一个站点绑定多个域名?用ServerAlias以前很笨,要使多个域名指向同一站点总是这样写: <VirtualHost *:80>ServerAdmin i@kuigg ...

  6. 【ZZ】Java : 一个帝国的诞生 & 假如时光能够倒流, 我会这么学习Java

    Java : 一个帝国的诞生 http://dy.qq.com/article.htm?id=20160523A06XFS00 写的很有意思,一下子了解了JAVA的历史. 假如时光能够倒流, 我会这么 ...

  7. Java调用cmd命令 打开一个站点

    使用Java程序打开一个站点 近期做了个东西使用SWT技术在一个client程序 须要升级时在提示升级 点击窗口上的一个连接 打开下载网页 花费了我非常长时间 用到了把它记录下来  怕是忘记,须要时能 ...

  8. Confluence 6 恢复一个站点

    这个页面对如何从一个 XML 导出文件中恢复到一个已经存在的 Confluence 站点进行描述. 如果你希望导入数据倒一个新的站点,请参考 restoring from backup during ...

  9. Confluence 6 编辑一个站点装饰文件

    希望编辑一个站点的 decorator 文件: 进入  > 基本配置(General Configuration) > 布局(Layouts )(在Look and Feel 菜单下面) ...

随机推荐

  1. 20款jquery下拉导航菜单特效代码分享

    20款jquery下拉导航菜单特效代码分享 jquery仿京东商城左侧分类导航下拉菜单代码 jQuery企业网站下拉导航菜单代码 jQuery css3黑色的多级导航菜单下拉列表代码 jquery响应 ...

  2. linux下搭建svn服务器

    安装步骤如下: 1.yum install subversion   2.输入rpm -ql subversion查看安装位置,如下图:   我们知道svn在bin目录下生成了几个二进制文件. 输入 ...

  3. unix环境高级编程-读书笔记与习题解答-第一篇

    从这周开始逐渐的进入学习状态,每天晚上都会坚持写c程序,并且伴随对这本书的深入,希望能写出更高质量的读书笔记和程序. 本书的第一章,介绍了一些关于unix的基础知识,在这里我不想去讨论linux到底是 ...

  4. BZOJ 1038 瞭望塔

    Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...

  5. Visual C++ 8.0对象布局的奥秘:虚函数、多继承、虚拟继承(VC直接输出内存布局)

    原文:VC8_Object_Layout_Secret.html 哈哈,从M$ Visual C++ Team的Andy Rich那里又偷学到一招:VC8的隐含编译项/d1reportSingleCl ...

  6. c#:for循环;穷举,迭代 练习

    一)穷举 1. 第x种买法:羽毛球拍xx个,羽毛球xx个,水xx瓶 2. 单位给发了一张150元购物卡,拿着到超市买三类洗化用品.     洗发水15元,香皂2元,牙刷5元.求刚好花完150元,有多少 ...

  7. UIAutomation识别UI元素

    MS UI Automation(Microsoft User Interface Automation:UIA)是随.net framework3.0一起发布的,虽然在如今这个几乎每天都有各种新名词 ...

  8. android studio 新建项目 界面一直停在 【“building ‘ 项目名’ gradle project info”】

    zhezhelin android studio 新建项目 界面一直停在 [“building ‘ 项目名’ gradle project info”] 安装了android studio 之后,按照 ...

  9. Lua I/0输入输出

    I/O库为文件操作提供了两种不同的模型,简单模型和完整模型.简单模型假设一个当前输入文件和一个当前输出文件,他的I/O操作均作用于这些文件.完整模型则使用显式的文件句柄,并将所有的操作定义为文件句柄上 ...

  10. 【POJ】1035 Spell checker

    字典树. #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib ...