例子

关系数据库: 创建表

CREATE TABLE posts (

id SERIAL PRIMARY KEY,

author VARCHAR(30) NOT NULL,

title VARCHAR(50) NOT NULL,

body TEXT NOT NULL,

created DATE NOT NULL

);

关系数据库: 查询

SELECT * FROM posts WHERE id = 99;

关系数据库: 查询结果

id | author | title | body | created

----+------------+--------------------------------+----------------------------+------------

99 | John Daily | Riak Development Anti-Patterns | Writing an application ... | 2014-01-07

基本转换和存储过程如下

每一个表行被转换为一个JSON对象,包含除id字段外的所有其他字段.

id字段不会存储在Riak中的JSON对象中. 它不会作为对象的键. 而是把标题作为键, 30字符长度限制, 小写, 并且用-作为单词之间的连字符. 比如上面的例子把riak-development-anti-patterns作为键.

所有产生自posts表的JSON对象存储在名为posts的单个Riak桶当中.

键存在在Riak set中, 需要的时候, 使所有对象可以被一次查询出来.

把Table转换为List

下面, 我们使用psycopg2库来把表转换为列表

import psycopg2

connection = psycopg2.connection('dbname=blog_db')

cursor = connection.cursor()

用该游标(cursor)执行SELECT * FROM posts查询,然后使用fetchall函数从游标当中获取信息:

cursor.execute('SELECT * FROM posts')

table = cursor.fetchall()

table对象由一个Python元组列表构成, 如下:

[(1, 'John Doe', 'Post 1 title', 'Post body ...', datetime.date(2014, 1, 1)),

(2, 'Jane Doe', 'Post 2 title', 'Post body ...', datetime.date(2014, 1, 2)),

# more posts in the list

]

转换行为JSON对象

上面的代码把posts表中的每一行数据转换为包含5个元素的元组, 为了更好的进行转换, 我们把元组转换为能够在Riak中更好的处理的Python字典数据类型, 官方的Riak Python客户端能够自动地把Python字段转换为能够在Riak中存储的JSON对象. 一旦我们有了一个字典列表, 就可以直接在Riak中存储这些字典类型的数据.

下面通过Python代码把数据库中的数据转换为JSON格式:

import datetime

def convert_row_to_dict(row):

return {

'author': row[1],

'title': row[2],

'body': row[3],

'created': row[4].strftime('%m-%d-%Y')

}

产生如下的JSON数据:

{

'author': 'John Daily',

'title': 'Riak Development Anti-Patterns',

'body': 'Writing an application ...',

'created': '01-07-2014'

}

存储行对象

现在使用store_row_in_riak把posts表中的数据存储到Riak中:

用博客的标题来构造键, 获取签名30字符, 字符全部转换为小写, 并用-替换空格.

每行将被转换为一个正确的Riak对象,并存储

下面是这个函数的实现:

bucket = client.bucket('posts')

def store_row_in_riak(row):

key = row[2][0:29].lower().replace(' ', '-')

obj = RiakObject(client, bucket, key)

obj.content_type = 'application/json'

obj.data = convert_row_to_dict(row)

obj.store()

上面我们在一个Riak set存储所有对象的键, 以帮助我们在将来能够查询这些对象. 我们修改上的store_row_in_riak函数添加每一个键到一个set(集合):

from riak.datatypes import Set

objects_bucket = client.bucket('posts')

key_set = Set(client.bucket_type('sets').bucket('key_sets'), 'posts')

def store_row_in_riak(row):

key = row[0]

obj = RiakObject(client, bucket, key)

obj.content_type = 'application/json'

obj.data = convert_row_to_dict(row)

obj.store()

现在,我们编写一个迭代器用于存储所有的行:

# Using our "table" object from above:

for row in table:

store_row_in_riak(row)

一旦所有对象存储到Riak, 我们可以执行正常的键/值操作来一个一个地获取. 下面是一个使用Riak HTTP API的例子:

curl http://localhost:8098/buckets/posts/keys/99

这将返回一个博客(Blog)对象:

{

"author": "John Daily",

"title": "Riak Development Anti-Patterns",

"body": "Writing an application ...",

"created": "01-07-2014"

}

需要的时候, 我们也可以一次获取所有这些对象. 前面我们在Raik set中存储了所有对象的键. 我们可以编写一个函数从set中获取所有对象的key, 以及和这些key相关的所有对象:

from riak.datatypes import Set

set_bucket = client.bucket_type('sets').bucket('key_sets')

posts_bucket = client.bucket('posts')

def fetch_all_objects(table_name):

keys = Set(client, bucket, table_name)

for key in keys:

return posts_bucket.get(key)

fetch_all_objects('posts')

这回返回之前存储的Python字典的完整列表.

使用二级索引

添加一个关键字字段(keywords), 来描述一篇博客的关键字列表:

CREATE TABLE posts (

id SERIAL PRIMARY KEY,

author VARCHAR(30) NOT NULL,

title VARCHAR(50) NOT NULL,

body TEXT NOT NULL,

created DATE NOT NULL,

keywords TEXT[] NOT NULL

);

插入数据:

INSERT INTO posts (author, title, body, created, keywords) VALUES

('Basho', 'Moving from MySQL to Riak', 'Traditional database architectures...',

current_date, '{"mysql","riak","migration","rdbms"}');

为没一个博客的关键字列表添加一个二级索引. 下面我们编写一个函数对每一个关键字附加一个二级索引.

def add_keyword_2i_to_object(obj, keywords):

for keywork in keywords:

obj.add_index('keywords_bin', keyword)

然后我们可以插入该函数到store_row_in_riak函数中:

bucket = client.bucket('posts')

def store_row_in_riak(row):

obj = RiakObject(client, bucket, row[0])

obj.content_type = 'application/json'

obj.data = convert_row_to_dict(row)

add_keyword_2i_to_object(obj, row[5])

obj.store()

现在我们可以基于一篇博客的关键字来查询:

bucket = client.bucket('posts')

def fetch_posts_by_keyword(keyword):

for key in bucket.get_index('keywords_bin', keyword):

return bucket.get(key)

该函数会返回所有包含特定关键字的博客列表.

riak mysql_[Translate] 从SQL数据库迁移到Riak相关推荐

  1. 一起来玩AZURE SQL(三)AZURE SQL 数据库迁移

    如何将本地数据库迁移到Azure SQL,一般来说分为几部分工作, 兼容性测试:验证数据库是否与 SQL 数据库 V12 兼容. 解决兼容性问题(如果有):如果验证失败,必须先解决验证错误. 运行迁移 ...

  2. aws 数据库迁移_将您的sql数据库迁移到云AWS和Azure

    aws 数据库迁移 When migrating your SQL databases to the cloud you need to make your choice carefully. Mig ...

  3. 中控考勤机 本地mysql_中控考勤机SQL数据库建立方法及常用操作

    释放双眼,带上耳机,听听看~! 首先客户电脑上需要安装sqlserver数据库(2000或者是2005版本) 安装方法就不在这里介绍,下面说一下数据库的建立办法.(以2005版本为例) 1.打开数据库 ...

  4. 从SQL Server到多数据库,微软数据库迁移全攻略

    据了解,截止到 2022,云迁移市场规模将达到 1290 亿美元,云迁移服务市场的利润率达 26.7%.数据库作为企业迁移上云的关键环节,自然成为了各大云厂商关注的重点,除了提供各种各样的云端数据库, ...

  5. sql azure 语法_如何将内部SQL Server数据库迁移到Azure

    sql azure 语法 Lately, database administrators often hear the question "have you tried Azure?&quo ...

  6. 应用程序的数据库从Sql Server迁移到Oracle

    应用程序的数据库从Sql Server迁移到Oracle 迁移案例一:数据库: Sql Server 2008到Oracle 9i 工具: Sybase PowerDesiner 12 试用版, PL ...

  7. h2 迁移到 mysql_[saiku] 将saiku自带的H2嵌入式数据库迁移到本地mysql数据库

    saiku数据库的表和用户默认创建是在启动项目的时候,通过初始化 saiku-beans.xml 中的 h2database 这个 bean 执行org.saiku.service.Database类 ...

  8. 从Sql server 2000 到 Oracle 10g数据库迁移数据类型转化

    2010-01-12 从Sql server 2000 到 Oracle 10g数据库迁移数据类型转化 文章分类:数据库 SqlServer 2k转换为Oracle 10g 列名 SqlServer数 ...

  9. go 获得 mysql 实际运行 SQL,Golang实践录:一个数据库迁移的代码记录

    实现一个数据库迁移的案子.有些知识点值得记录. 技术框架 github.com/go-xorm/xorm:数据库操作 github.com/denisenkom/go-mssqldb:sqlserve ...

最新文章

  1. 详细讲解SQL Server索引的性能问题
  2. 纪中模拟赛——接苹果
  3. 如何以及为什么序列化Lambda
  4. 前端学习(1971)vue之电商管理系统电商系统之完成参数的添加操作
  5. html坐标绘制路径,canvas学习笔记之绘制简单路径
  6. 13商软 《软件工程》课程设计
  7. 12个很棒的Pandas和NumPy函数,让python数据分析事半功倍
  8. js 阻止冒泡事件和默认事件
  9. java skip_Java LongStream skip()用法及代码示例
  10. saltstack远程操作WINDOWS的POWERSHELL脚本
  11. 洛谷P1238 走迷宫
  12. matlab 单输入单输出线性时不变系统,试验线性时不变系统的时域分析及MATLAB实现.DOC...
  13. 计算机成绩统计优秀率,高校学生考试成绩的数据分析模式与可视化研究
  14. 620集成显卡和mx250,残血还是满血?一招看清MX250显卡真面目
  15. 2015年国际数学奥林匹克(IMO)试题
  16. java常用设计模式11—适配器模式
  17. 安卓进阶之android系统架构
  18. 法院判了!耿美玉起诉饶毅名誉侵权,驳回请求!但对饶毅方也应给予批评......
  19. android 扫码枪 字符数少掉,BarTender条码字符数莫名变少是怎么回事?
  20. 最全的厚黑学…教你怎样混社会

热门文章

  1. GitHub秒变GayHub
  2. 2017山东单招计算机试题,2017年山东单招数学模拟试题及标准答案.docx
  3. 无线路由的beacon interval
  4. Webrtc 多人视频会议系统 服务器 Licode 介绍
  5. 蚂蚁集团开源大规模视频侵权定位数据集
  6. f2fs学习笔记 - 7. f2fs文件打开
  7. SpringMVC基础一
  8. ffmpeg学习 函数分析sws_scale
  9. hadoop暂时永久关闭安全模式
  10. 《非Pad勿扰》风靡平板电脑界