一个站点的诞生06-- ORM
站点上的数据,存在数据库里。
一般用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的更多相关文章
- 一个站点的诞生02--用Scrapy抓取数据
假设想抓数据,就须要有爬虫程序,业内叫crawler或者spider. 有各种语言版本号的开源爬虫.c++, Java, php,在github上搜一下,以"spider c++" ...
- Django框架06 /orm多表操作
Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ...
- MVC利用Routing实现多域名绑定一个站点、二级域名以及二级域名注册Area
最近有这么个需求:在一个站点上绑定多个域名,每个域名进去后都要进入不同的页面.实现了这个功能以后,对于有多个域名,且有虚拟空间,但是虚拟空间却只匹配有一个站点的用户来说,可以节省很多小钱钱. 很久以前 ...
- Nginx技巧:灵活的server_name,Nginx配置一个服务器多个站点 和 一个站点多个二级域名
http://www.cnblogs.com/buffer/archive/2011/08/17/2143514.html Nginx强大的正则表达式支持,可以使server_name的配置变得很灵活 ...
- APACHE如何里一个站点绑定多个域名?用ServerAlias
APACHE2如何里一个站点绑定多个域名?用ServerAlias以前很笨,要使多个域名指向同一站点总是这样写: <VirtualHost *:80>ServerAdmin i@kuigg ...
- 【ZZ】Java : 一个帝国的诞生 & 假如时光能够倒流, 我会这么学习Java
Java : 一个帝国的诞生 http://dy.qq.com/article.htm?id=20160523A06XFS00 写的很有意思,一下子了解了JAVA的历史. 假如时光能够倒流, 我会这么 ...
- Java调用cmd命令 打开一个站点
使用Java程序打开一个站点 近期做了个东西使用SWT技术在一个client程序 须要升级时在提示升级 点击窗口上的一个连接 打开下载网页 花费了我非常长时间 用到了把它记录下来 怕是忘记,须要时能 ...
- Confluence 6 恢复一个站点
这个页面对如何从一个 XML 导出文件中恢复到一个已经存在的 Confluence 站点进行描述. 如果你希望导入数据倒一个新的站点,请参考 restoring from backup during ...
- Confluence 6 编辑一个站点装饰文件
希望编辑一个站点的 decorator 文件: 进入 > 基本配置(General Configuration) > 布局(Layouts )(在Look and Feel 菜单下面) ...
随机推荐
- wordpress整站搬家总结
去年图便宜,也没准备认真写博文,所以花了几百元钱买了个国内空间(域名已经备案).购买了以后,放了一个wordpress博客,没事的时候写写博文,但从没有抽出时间去写,文章的质量也不追求.一开始还可以, ...
- PHP面向对象(OOP):PHP5接口技术(interface)
PHP与大多数面向对象编程语言一样,不支持多重继承.也就是说每个类只能继承一个父类.为了解决这个问题,PHP引入了接口,接口的思想是指定了一个实现了该接口的类必须实现的一系列方法.接口是一种特殊的抽象 ...
- 关于在DEDECMS当中模板文件不存在的解决方案
大家可能在生成文档的时候遇到过,模板文件不存在,无法解析 这个问题,其实这个遇到这个问题的大多数人应该是修改了默认模板的名称才导致这样的问题,如果你避免这种问题大家在一开始对模板进行命名的时候就要写 ...
- 分布式系统间通信之RPC简单Demo(七)
看似终点,回到起点.第一次接触C#,编写的第一个真正的Demo是基于Socket的简单通信,现在JAVA开始的第一个RPC的Demo也是基于Socket.. 下面通过java原生的序列化,Socket ...
- [BZOJ 2326] [HNOI2011] 数学作业 【矩阵乘法】
题目链接:BZOJ - 2326 题目分析 数据范围达到了 10^18 ,显然需要矩阵乘法了! 可以发现,向数字尾部添加一个数字 x 的过程就是 Num = Num * 10^k + x .其中 k ...
- Area
http://poj.org/problem?id=1265 #include<cstdio> #include<istream> #include<algorithm& ...
- 自制SCVMM 模板成功
其实,如果通过SCVMM 的PS命令来创建虚拟机的话,模板的意义也不是特别大. 其它的PROFILE和硬件配置都会被替换掉的. ~~~~~~~~~~~~~~~ Windows模版 一. 准备OS的VH ...
- OPENFILER记下,有空再玩之,ISCSI,以后网络起来了,速度还是应该可以的
- Delphi 的各种错误信息(中英文)
******************************* * 编 译 错 误 信 息 * ******************************* ';' not allowed befo ...
- WallsEveryDay 必应桌面壁纸
软件名:WallsEveryday 陈述: 无聊时写着玩的一个桌面壁纸的软件,壁纸是自动从必应下载,所以每天都会有新的. 在ubuntu上测试通过,windows上找了台win7测试通过,其他没测试. ...