`
mozhenghua
  • 浏览: 324806 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

erlang mnesia 创建表记录

 
阅读更多

 通过前一篇博已经了解了mnesia数据库如何初始化,如何启动,在这篇博客中你将了解到如何在 mnesia数据库上创建表,并且如何对创建的表进行增删改查操作。

 

  因为创建mnesia数据库过程中需要使用到erlang的record数据结构,所以得先写一个create_tables的模块来封装初始化表的操作,以下是create_tables.erl 的代码:

 

-module(create_tables).

%% ====================================================================
%% API functions
%% ====================================================================
-export([init_tables/0,insert_user/2]).

%% ====================================================================
%% Internal functions
%% ====================================================================

-record(user,{id,name}).

init_tables()->
	io:format("~p~n", [record_info(fields,user)]),
	mnesia:create_table(user, [{attributes,record_info(fields,user)}]).


insert_user(Id,Name)->
	mnesia:dirty_write(#user{id=Id,name=Name}).

      首先在文件头部需要定义一个名为user的record的数据结构用来描述用户数据结构,在init_tables 方法中

调用了mnesia:create_table/2 方法,该方法的第二个参数有其他可选参数可以填,但是在这里都是用默认值。其中最重要的两个可选参数是:持久化类型,和键值类型,默认的持久化类型是ram内存保存的,键值类型是set(键值唯一,且键值是按照hash结构存储的,如果需要键值重复,可选用bag类型或者ordered_set类型)。

       这里需要说明的是定义的user记录和表名“user”并没有绑定的关系,表名完全可以用另外名称。

  

       在方法体中调用了mneisa的dirty_write 方法,与这个方法对应的是write方法,一个是脏写,一个是非脏写,区别是后者写入需要在一个事务中,如果事务中的任何一个步骤失败都会导致事务回滚,而dirty_write方法不会。

 

     结下来我们就在shell中执行以下创建表的操作:

     编译create_tables 模块

c(create_tables).

create_tables:init_tables().

create_table:insert_user(123,"mozhenghua").
create_table:insert_user(122,"baisui").

 

    

   好现在我们创建了一张名字叫user的内存表,并且向表中插入了两条记录。接下来我们就可以试试查询操作了。

 mnesia:dirty_read(user,123)

 通过主键查询用户表的记录。需要说明的是在记录中的第一个属性是作为表的主键索引存储的。

 

    如果不是是要通过name来查询用户记录的话,可以使用dirty_select/2 方法,通过使用带匹配规范的select来进行查询,这是一种更灵活的查询方法,这个东西极其复杂,好在进行简单的查询还是简洁明了。

可以使用这样的规范来进行查询:

mnesia:dirty_select(user,[{MatchHead.[Guard],[Result]}]).

    MatchHead: 是一个erlang的项式样,用于描述查询模式,

    Guard:是一个结果结合过滤器

    Result:用以描述查询结果的格式

 

    例如现在要查询 name为“baisui”的记录,可以这么写:

mnesia:dirty_select(user, [{#user{id='_',name="baisui"},[],['$_']}]).

    这个条件式初看起来比较晦涩难懂,且听我的分析  ‘_’ 的意思是配所有所有结果,这个写法只能出现在MatchHead中。

    ['$_'] 这个的意思是结果是要得到一整条user记录。

 

   如果在结果中只需要得到id字段,那查询逻辑可以这样写:

   mnesia:dirty_select(user, [{#user{id='$1',name="baisui"},[],['$1']}]).

 

分享到:
评论

相关推荐

    erlang——Mnesia用户手册.pdf

    3.4.创建新表 4、事务和其他上下文存取 4.1.事务属性 4.2.锁 4.3.脏操作 4.4.记录名与表 4.5.作业(Activity)概念和多种存取上下文 4.6.嵌套事务 4.7.模式匹配 4.8.迭代 5、其它.Mnesia.特性 ...

    Mnesia用户手册.zip

    3. 表模式:Mnesia支持多种表类型,如简单记录(flat files)、行链接表(linked-in disk tables)和内存表(RAM tables)。这些不同的表类型可以根据性能和持久性需求进行选择。 4. 查询语言:Mnesia提供了一个...

    Mnesia用户手册(docx版)

    - **创建新表**:创建新表时,需要指定表的名称、表的类型(例如,是正交表还是ADT)、键的类型以及记录的结构。表的大小和内存分配也在此时进行配置。 4. **事务和其他上下文存取** - **事务属性**:Mnesia 提供...

    Mnesia table fragmentation 过程及算法分析

    首先,需要在 Erlang 节点上创建一个 schema,然后启动 Mnesia 系统,并定义一个记录的模式。之后,创建一个表并插入一些数据,可以看到数据被存储在不同的分片中。通过执行一系列 Mnesia 命令,可以启动或停止表的...

    Mnesia用户手册

    Mnesia提供了丰富的API函数来管理数据库,包括创建、删除表,插入、更新和删除记录,以及执行查询等。这些函数以Erlang的函数调用形式存在,易于理解和使用。 **7. 高可用性与容错** Mnesia的复制和故障恢复机制是...

    Mnesia用户手册 4.4.10版.rar

    Mnesia是一个分布式数据库管理系统(DBMS),适合于电信和其它需要持续运行和具备软实时特性的Erlang应用。 目 录 1 、介绍 . . .. . .. . . .. . 4 1.1 关于 Mnesia . . .. . .. . . .. . 4 1.2 Mnesia ...

    erlang聊天室源码

    5. **状态管理模块**:保存聊天室的状态,如在线用户列表、历史记录等,可能采用了Erlang的分布式数据库如Mnesia来存储。 在源码中,你可能会看到Erlang的并发特性如`spawn`和`receive`表达式,它们允许创建和管理...

    ecto_mnesia:Mnesia Erlang术语数据库的Ecto适配器

    它支持记录和表的存储,提供了灵活的数据模型,并且可以进行分布式操作。Mnesia有以下关键特点: 1. **事务性**:Mnesia支持ACID(原子性、一致性、隔离性、持久性)事务,确保了数据的一致性。 2. **分布式**:...

    Erlang-OTP-API 离线查询英文全手册

    7. **并发和进程管理**:Erlang的并发模型基于轻量级进程(LWP),手册会讲解如何创建、通信和管理进程,以及如何利用`spawn`、`send`、`receive`等机制。 8. **性能和监控**:通过`observer`工具和其他监控模块,...

    英雄远征erlang服务器源码含数据库

    Erlang提供了多种数据库连接库,如Mnesia(Erlang内置的分布式数据库)或者其他第三方库如MySQL、PostgreSQL的驱动,用于存储和检索游戏数据。 6. **游戏源码分析**:对于初学者来说,分析游戏服务器的源码可以帮助...

    tsung+erlang包

    OTP 包含了 Erlang 编程语言的标准库,以及一系列预先设计好的应用程序和服务,如 Mnesia 数据库、 supervision trees(监督树)和 gen_server行为模式等。通过这个源代码,你可以深入了解 Erlang 的工作原理和 OTP ...

    最新版erlang安装包程序下载

    OTP是Erlang的标准库和框架集合,包含了各种模块和服务,如分布式计算、监控、日志记录和错误处理等,使得开发者可以快速构建高效、可扩展的系统。 Erlang的特性包括: 1. **并发性**:Erlang的轻量级进程模型使得...

    备忘录:Mnesia分布式数据库的简单+强大接口

    Mnesia支持两种数据类型:表和记录。表类似于关系数据库中的表格,而记录则类似于结构化的数据对象。此外,Mnesia还提供了一些特定的数据模式,如SET、Bag和Ordered Set,以适应不同的数据访问模式。 5. **事务**...

    erlang_standard_snippets-源码.rar

    Erlang是一种面向并发...源码中可能会利用到OTP的一些组件,如ETS(Erlang Term Storage)或Mnesia数据库。 通过分析和学习这个源码库,你可以深入了解Erlang语言的特性,提高在并发编程和分布式系统设计方面的技能。

    amnesia-开源

    例如,通过AMNESIA,你可以直接创建、读取、更新和删除(CRUD)数据库记录,而无需编写SQL查询。 AMNESIA支持多种关系数据库,包括MySQL、PostgreSQL、SQLite等,这为开发者提供了灵活性,可以根据项目需求选择合适...

    基于Erlang的gen_tcp聊天室代码,功能完整

    在Erlang中,可以使用ETS(Erlang Term Storage)或Mnesia分布式数据库来保存用户信息。 2. **登录**:用户登录时验证用户名和密码,成功后分配一个唯一标识符,用于后续通信。 3. **获取登录时间**:记录并返回用户...

    Erlang中文手册

    - **定义**: Erlang中用于声明记录类型的文件。 - **示例**: - `-record(person, {name, age}).` **1.5.3 记录 (Records)** - **定义**: 用于组织相关数据的一种方式。 - **访问成员**: - `#person{name="Alice...

    otp_src_26.1.tar.gz

    学习Mnesia的表结构、查询语句以及如何与其他 OTP 库协同工作是重要的实践内容。 4. **Releases和Applications**:OTP引入了“Releases”和“Applications”的概念,用于组织和管理Erlang程序的生命周期。了解如何...

Global site tag (gtag.js) - Google Analytics