通过前一篇博已经了解了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']}]).
相关推荐
3.4.创建新表 4、事务和其他上下文存取 4.1.事务属性 4.2.锁 4.3.脏操作 4.4.记录名与表 4.5.作业(Activity)概念和多种存取上下文 4.6.嵌套事务 4.7.模式匹配 4.8.迭代 5、其它.Mnesia.特性 ...
3. 表模式:Mnesia支持多种表类型,如简单记录(flat files)、行链接表(linked-in disk tables)和内存表(RAM tables)。这些不同的表类型可以根据性能和持久性需求进行选择。 4. 查询语言:Mnesia提供了一个...
- **创建新表**:创建新表时,需要指定表的名称、表的类型(例如,是正交表还是ADT)、键的类型以及记录的结构。表的大小和内存分配也在此时进行配置。 4. **事务和其他上下文存取** - **事务属性**:Mnesia 提供...
首先,需要在 Erlang 节点上创建一个 schema,然后启动 Mnesia 系统,并定义一个记录的模式。之后,创建一个表并插入一些数据,可以看到数据被存储在不同的分片中。通过执行一系列 Mnesia 命令,可以启动或停止表的...
- **记录名与表**:支持通过记录名直接访问表,简化了数据访问过程。 - **作业概念与多种上下文**:定义了不同的数据访问方式,包括事务上下文、脏上下文等。 - **嵌套事务**:允许多个事务嵌套在一起执行。 - *...
Mnesia提供了丰富的API函数来管理数据库,包括创建、删除表,插入、更新和删除记录,以及执行查询等。这些函数以Erlang的函数调用形式存在,易于理解和使用。 **7. 高可用性与容错** Mnesia的复制和故障恢复机制是...
Mnesia是一个分布式数据库管理系统(DBMS),适合于电信和其它需要持续运行和具备软实时特性的Erlang应用。 目 录 1 、介绍 . . .. . .. . . .. . 4 1.1 关于 Mnesia . . .. . .. . . .. . 4 1.2 Mnesia ...
5. **状态管理模块**:保存聊天室的状态,如在线用户列表、历史记录等,可能采用了Erlang的分布式数据库如Mnesia来存储。 在源码中,你可能会看到Erlang的并发特性如`spawn`和`receive`表达式,它们允许创建和管理...
它支持记录和表的存储,提供了灵活的数据模型,并且可以进行分布式操作。Mnesia有以下关键特点: 1. **事务性**:Mnesia支持ACID(原子性、一致性、隔离性、持久性)事务,确保了数据的一致性。 2. **分布式**:...
7. **并发和进程管理**:Erlang的并发模型基于轻量级进程(LWP),手册会讲解如何创建、通信和管理进程,以及如何利用`spawn`、`send`、`receive`等机制。 8. **性能和监控**:通过`observer`工具和其他监控模块,...
Erlang提供了多种数据库连接库,如Mnesia(Erlang内置的分布式数据库)或者其他第三方库如MySQL、PostgreSQL的驱动,用于存储和检索游戏数据。 6. **游戏源码分析**:对于初学者来说,分析游戏服务器的源码可以帮助...
OTP 包含了 Erlang 编程语言的标准库,以及一系列预先设计好的应用程序和服务,如 Mnesia 数据库、 supervision trees(监督树)和 gen_server行为模式等。通过这个源代码,你可以深入了解 Erlang 的工作原理和 OTP ...
OTP是Erlang的标准库和框架集合,包含了各种模块和服务,如分布式计算、监控、日志记录和错误处理等,使得开发者可以快速构建高效、可扩展的系统。 Erlang的特性包括: 1. **并发性**:Erlang的轻量级进程模型使得...
Mnesia支持两种数据类型:表和记录。表类似于关系数据库中的表格,而记录则类似于结构化的数据对象。此外,Mnesia还提供了一些特定的数据模式,如SET、Bag和Ordered Set,以适应不同的数据访问模式。 5. **事务**...
Erlang是一种面向并发...源码中可能会利用到OTP的一些组件,如ETS(Erlang Term Storage)或Mnesia数据库。 通过分析和学习这个源码库,你可以深入了解Erlang语言的特性,提高在并发编程和分布式系统设计方面的技能。
例如,通过AMNESIA,你可以直接创建、读取、更新和删除(CRUD)数据库记录,而无需编写SQL查询。 AMNESIA支持多种关系数据库,包括MySQL、PostgreSQL、SQLite等,这为开发者提供了灵活性,可以根据项目需求选择合适...
在Erlang中,可以使用ETS(Erlang Term Storage)或Mnesia分布式数据库来保存用户信息。 2. **登录**:用户登录时验证用户名和密码,成功后分配一个唯一标识符,用于后续通信。 3. **获取登录时间**:记录并返回用户...
- **定义**: Erlang中用于声明记录类型的文件。 - **示例**: - `-record(person, {name, age}).` **1.5.3 记录 (Records)** - **定义**: 用于组织相关数据的一种方式。 - **访问成员**: - `#person{name="Alice...
学习Mnesia的表结构、查询语句以及如何与其他 OTP 库协同工作是重要的实践内容。 4. **Releases和Applications**:OTP引入了“Releases”和“Applications”的概念,用于组织和管理Erlang程序的生命周期。了解如何...