这篇5000多字博客也花了我几天的时间?,主要是我对MySQL一部分重要知识点的理解【后面当然还会写博客补充噻,欢迎关注我哟】,当然这篇文章可能也会有不恰当的地方【毕竟也写了这么多字,错别字可能也不少?】,不足的地方欢迎各位的指正。
ps:【文章最后有相关练习题的分享】
1、什么时候用主键?2、主键有什么用处 3、一张表可以设置几个主键?4、一个主键只能是一列吗?5、主键和唯一索引有什么区别?
1)每个表应该有一个主键 。 定义一个保证唯一标识每个logging的主键。
2)数据库主键,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性。主键主要是用与其他表的外键关联,以及文本记录的修改与删除。
3) 一张表只可以有一个主键
4)主键不一定只有一列,有些表的主键是多个属性构成的。表定义为列的集合
5)主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。 1、主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。 2、唯一性索引列允许空值,而主键列不允许为空值。 3、主键列在创建时,已经默认为空值 + 唯一索引了。 4、主键可以被其他表引用为外键,而唯一索引不能。
比如我们要创建一张名为 "tb1"的表并且将它的id列设置为主键
creat table tb1( id int not null auto_increment primary key, )
为“tb1”的表创建多个主键
creat table tb1( id int not null auto_increment , pid int(11) not NULL, primary key(id, pid) )
desc tablenames 主要用来查看数据表的表结构
比如用以下命令创建了一张‘user’表
create table user( id int auto_increment primary key, name varchar(10), gender char(2) )engine=innodb default charset=utf8;使用以上命令后可以得到如下结果:
该语句的功能:查看表创建时的定义
列如对上面的‘user’表执行该操作得到如下结果:
但是上面的结果看起来非常混乱,我们可以使用\G【\G 的作用是将查到的结构旋转90度变成纵向】使得结果更加美观
我们首先查看上面user表中的数据
不难看出这个表的id列已经自增到了5,其中show create table 表名;可以看出AUTO_INCREMENT=6,这个就表示接下来id列要递增成为的数字,
下一步我们使用delete from user;语句来删除这个表接着我们使用
insert into user (name, gender) values('周周', '男');再向表中插入一列会发现id列是从6开始递增
这时我们就会想,可不可以重新从1开始,或者自定义开始递增时的值呢?
alter table user AUTO_INCREMENT=1;
要特别注意如果设置的初始值小于原来表递增列最后一个数据的值,那么语句是不会生效的
步长设置我就不举例了,上面是设置递增列的初始值,这个是步长【不设置默认是1】
语法:
set session auto_increment_increment=2; 设置会话步长 show session variables like 'auto_inc%'; 查看全局变量但是要强调一点:
MySQL: 自增步长是基于会话级别的【登入一次mysql就是一次会话】,改变一次步长之后同一次会话创建的所有表的步长都会改变为你设置的步长;
SqlServer:自增步长:是基础表级别的:可以单独的对某一张表的步长进行设置,而不改变全局的步长;
总结:SqlServer方便一点
MySQL: 自增步长 基于会话级别: show session variables like 'auto_inc%'; 查看全局变量 set session auto_increment_increment=2; 设置会话步长 # set session auto_increment_offset=10; 基于全局级别(接下来开的所有会话的步长都会改变): show global variables like 'auto_inc%'; 查看全局变量 set global auto_increment_increment=2; 设置会话步长 # set global auto_increment_offset=10; 设置起始值 SqlServer:自增步长: 基础表级别: CREATE TABLE `t5` ( `nid` int(11) NOT NULL AUTO_INCREMENT, `pid` int(11) NOT NULL, `num` int(11) DEFAULT NULL, PRIMARY KEY (`nid`,`pid`) ) ENGINE=InnoDB AUTO_INCREMENT=4, 步长=2 DEFAULT CHARSET=utf8 CREATE TABLE `t6` ( `nid` int(11) NOT NULL AUTO_INCREMENT, `pid` int(11) NOT NULL, `num` int(11) DEFAULT NULL, PRIMARY KEY (`nid`,`pid`) ) ENGINE=InnoDB AUTO_INCREMENT=4, 步长=20 DEFAULT CHARSET=utf8
所谓唯一索引,就是在创建索引时,限制索引的字段值必须是唯一的。通过该类型的索引可以比普通索引更快速地查询某条记录。唯一索引顾名思义不可以重复,但是可以为空,这也是它与主键的区别之一
创建方法一:
CREATE UNIQUE INDEX indexName ON mytable(username(length))创建方法二【联合唯一索引】:
UNIQUE indexName (列名,列名),在创建表时的例子:
create table t1( id int ...., num int, xx int, UNIQUE 唯一索引名称 (列名,列名), # 示例 UNIQUE uql (num,xx), )
顾名思义就是外键的多种形式,下面会通过举例子的方式讲述
比如我们有两张表【用户表】 和【博客表】,如果每个用户只能注册一个博客,那么用户账号与博客账号的外键关系就是一对一
用户表: id name age 1 xaiom 23 2 eagon 34 3 lxxx 45 4 owen 83 博客表: id url user_id (外键 + 唯一约束) 1 /xiaom 2 2 /zekai 1 3 /lxxx 3 4 /owen 4
这个也是比较容易理解的,就比如我有两张表【用户表】 和【主机表】,每个用户可以登入多台主机,同时每台主机也可以被多个用户同时使用,这种关系就是多对多
用户表: id name phone 1 root1 1234 2 root2 1235 3 root3 1236 4 root4 1237 5 root5 1238 6 root6 1239 7 root7 1240 8 root8 1241 主机表: id hostname 1 c1.com 2 c2.com 3 c3.com 4 c4.com 5 c5.com 为了方便查询, 用户下面有多少台主机以及某一个主机上有多少个用户, 我们需要新建第三张表: 用户主机表: id userid hostid 1 1 1 2 1 2 3 1 3 4 2 4 5 2 5 6 3 2 7 3 4 创建的时候, userid 和 hostid 必须是外键, 然后联合唯一索引 unique(userid, hostid),(避免重复出现)【联合唯一索引在多对多的情况下可以视情况而写】 Django orm 也会设计
向表的某一行插入数据
insert into 表名(列名1, 列名2) values('行一内容', '行一内容'), ('行二内容', '行二内容')向表的多行插入数据
insert into 表名(列名1, 列名2) values('行一内容', '行一内容'), ('行二内容', '行二内容')向某一张表中插入另一张表中的内容
insert into 表一(name,age) select name,age from 表二;
假设我创建了一张表叫【tb1】其中列名有【name】列和【id】列
# 删除表 delect from tb1 # 带条件的删除 # 把id不等于2的行删除 delete from tb1 where id !=2 delete from tb1 where id =2 delete from tb1 where id > 2 delete from tb1 where id >=2 # 把id > 2,并且name='alex'的数据行删除 delete from tb1 where id >=2 or name='alex'
同样的使用上面删操作的表
# 把tb1表中的id > 2,并且name='XX'的数据行,的名字设为'alex',其他的不变 update tb1 set name='alex' where id>12 and name='xx' update tb1 set name='alex',age=19 where id>12 and name='xx'
基础的查操作
# 查看表中所有数据 select * from tb1; # 查看表中id,name列的数据 select id,name from tb1; select id,name from tb1 where id > 10 or name ='xxx'; # 查看表中id,name列的数据,并将name列名重新取个叫cname的别名 select id,name as cname from tb1 where id > 10 or name ='xxx'; select name,age,11 from tb1;进阶的查操作
select * from tb1 where id != 1 # 查看id为(1,5,12)中的数的行 select * from tb1 where id in (1,5,12); select * from tb1 where id not in (1,5,12); # 查tb1表中值id为tb11中元素的行 select * from tb1 where id in (select id from tb11) # 查看id为5到12之间数的行 select * from tb1 where id between 5 and 12;通配符的查操作
# 查询表中以ale开头的所有用户 %表示后面可以有任意多个字符,比如可以匹配到【alex,alexk】 select * from tb1 where name like "ale%" # 查询表中以ale开头的所有用户 _表示后面只能有一个字符,比如【alex】可以匹配到但是【alexxxx】就不可以匹配到 select * from tb1 where name like "ale_"
将上面知识是先看下面的图:
在我们浏览器搜素想要的内容时,返回的结果通常是很多的,如果一次将结果全部显示给你,那么电脑可能会崩溃,这时浏览器就会默认返回结果的前几十条,这种对想要查询结果的条数的限制我们在数据库中也可以使用limit来实现?7.5.1、limit【限制】的用法
# 查看表中的前十条数据 select * from tb1 limit 10; # 从0行开始后面取十条数据 select * from tb1 limit 0,10; select * from tb1 limit 10,10; # 从20行开始后面取十条数据 select * from tb1 limit 20,10; # 从第20行开始读取,读取10行; select * from tb1 limit 10 offset 20;?7.5.2、order by【排序语句】
# 将表tb1按id列从大到小排 select * from tb1 order by id desc; 大到小 【口诀先d后c,d在c后面所以是从大到小】 select * from tb1 order by id asc; 小到大 【口诀先a后c,c在a后面所以是从小到大】 # 将表tb1按age列从大到小排,如果id数值相同就按id列大小从小到大排 select * from tb1 order by age desc,id desc;拓展要点:取后十条数据
# 实现原理:将tb1表逆序,然后在取前十条数据,这样就相当于取了原表的最后十条数据 select * from tb1 order by id desc limit 10;
关键语句:
group by首先我们按如下的方式创建两张表【department表】【userinfo表】
department表 CREATE table department( id int auto_increment primary key, title varchar(32) )engine=innodb default charset=utf8; userinfo表 CREATE table userinfo( id int auto_increment primary key, name varchar(32), age int, depart_id int, CONSTRAINT fk_usrt_depart FOREIGN key (depart_id) REFERENCES department(id) )engine=innodb default charset=utf8; # 给两张表加数据 # department表 +----+-------+ | id | title | +----+-------+ | 1 | 财务 | | 2 | 公关 | | 3 | 测试 | | 4 | 运维 | +----+-------+ # userinfo表 +----+------+------+-----------+ | id | name | age | depart_id | +----+------+------+-----------+ | 1 | 小费 | 6 | 1 | | 2 | 小港 | 6 | 3 | | 3 | 小干 | 6 | 2 | | 4 | 小刚 | 6 | 4 | | 5 | 小强 | 6 | 4 | | 6 | 小美 | 6 | 4 | | 7 | 小亮 | 6 | 2 | | 8 | 小每 | 6 | 1 | +----+------+------+-----------+对于语句我就不多解释了,主要看结果就可以了
1、将同一个部门的人放在一起,并且用户部门相同取id值大的用户
SELECT depart_id, max(id) FROM userinfo GROUP BY depart_id;输出结果:
2、在上面操作的基础上显示各个部门的人数select count(id),max(id),depart_id from userinfo group by depart_id;输出结果:
3、如果对于聚合函数结果进行二次筛选时?必须使用havingselect count(id),depart_id from userinfo group by depart_id having count(id) > 1;

4、上面的列名为count(id),这是看着有点不舒服的,我们可以使用as关键字改名
5、进一步的进阶方式select count(id),depart_id from userinfo where id > 4 group by depart_id having count(id) > 1;
连表顾名思义就是将两张表连在一起查看的操作,操作大的分为两种内连接和外连接,而外连接又分为左连接、右连接和全连接。
内连接(inner join):只包含匹配的记录。
外连接(outer join):除了包含匹配的记录还包含不匹配的记录。{
1. 左连接(left join):返回匹配的记录,以及表 A 多余的记录。
2. 右连接(right join):返回匹配的记录,以及表 B 多余的记录。
3. 全连接(full join):返回匹配的记录,以及表 A 和表 B 各自的多余记录。
}
用网上一张图比较好的图可以更加方便理解如下:
下面我们都用【department表】【user_mess表】来举例:# department表 +----+-------+ | id | title | +----+-------+ | 1 | 财务 | | 2 | 公关 | | 3 | 测试 | | 4 | 运维 | +----+-------+ # user_mess表 +----+------+-----------+ | id | name | depart_id | +----+------+-----------+ | 1 | 小费 | 1 | | 2 | 小港 | 1 | | 3 | 小干 | 2 | | 4 | 小刚 | 4 | +----+------+-----------+执行如下语句可以连接两张表:
select * from user_mess,department where user_mess.depart_id = department.id; 输出结果: +----+------+-----------+----+-------+ | id | name | depart_id | id | title | +----+------+-----------+----+-------+ | 1 | 小费 | 1 | 1 | 财务 | | 2 | 小港 | 1 | 1 | 财务 | | 3 | 小干 | 2 | 2 | 公关 | | 4 | 小刚 | 4 | 4 | 运维 | +----+------+-----------+----+-------+ 4 rows in set (0.00 sec)
内连接 语法: a inner join b ,但是一般 inner 可以省略不写,也就是如下形式
select * from a join b ;执行下面语句:
select * from user_mess join department; 输出结果: +----+------+-----------+----+-------+ | id | name | depart_id | id | title | +----+------+-----------+----+-------+ | 4 | 小刚 | 4 | 1 | 财务 | | 3 | 小干 | 2 | 1 | 财务 | | 2 | 小港 | 1 | 1 | 财务 | | 1 | 小费 | 1 | 1 | 财务 | | 4 | 小刚 | 4 | 2 | 公关 | | 3 | 小干 | 2 | 2 | 公关 | | 2 | 小港 | 1 | 2 | 公关 | | 1 | 小费 | 1 | 2 | 公关 | | 4 | 小刚 | 4 | 3 | 测试 | | 3 | 小干 | 2 | 3 | 测试 | | 2 | 小港 | 1 | 3 | 测试 | | 1 | 小费 | 1 | 3 | 测试 | | 4 | 小刚 | 4 | 4 | 运维 | | 3 | 小干 | 2 | 4 | 运维 | | 2 | 小港 | 1 | 4 | 运维 | | 1 | 小费 | 1 | 4 | 运维 | +----+------+-----------+----+-------+说明:像这样不加查询条件会形成 笛卡尔积 。笛卡尔积的意思是:是指包含两个集合中任意取出两个元素构成的组合的集合。// 两表分别交叉查询了一遍;也可以加上条件查询条件 on 或者 using ,两者的区别在于 都是查询出符合条件的结果集 ,但是using会优化掉相同的字段。
下面来举个栗子更好理解:
# 使用on语句添加条件 select * from user_mess join department on user_mess.depart_id = department.id; 输出结果: +----+------+-----------+----+-------+ | id | name | depart_id | id | title | +----+------+-----------+----+-------+ | 1 | 小费 | 1 | 1 | 财务 | | 2 | 小港 | 1 | 1 | 财务 | | 3 | 小干 | 2 | 2 | 公关 | | 4 | 小刚 | 4 | 4 | 运维 | +----+------+-----------+----+-------+ 4 rows in set (0.00 sec)这时我们可以发现这与上面的
select * from user_mess,department where user_mess.depart_id = department.id;语句输出结果是相同的
语法:
# 左连接既 左边 tb_left 表作为基表(主表)显示所有行, tb_right 表作为外表 条件匹配上的就显示,没匹配上的就用 Null 填充 select * from tb_left left join tb_right on tb_left.id = tb_left.id ;栗子:
select * from user_mess left join department on user_mess.depart_id = department.id; 输出结果: +----+------+-----------+------+-------+ | id | name | depart_id | id | title | +----+------+-----------+------+-------+ | 1 | 小费 | 1 | 1 | 财务 | | 2 | 小港 | 1 | 1 | 财务 | | 3 | 小干 | 2 | 2 | 公关 | | 4 | 小刚 | 4 | 4 | 运维 | +----+------+-----------+------+-------+ 4 rows in set (0.00 sec)
语法:
# 右连接即 右边 tb_right 表作为基表(主表)显示所有行, tb_left 表作为外表 条件匹配上的就显示,没匹配上的就用 Null 填充; 和左连接相反。 select * from tb_left right join tb_right on tb_left.id = tb_left.id ;栗子:
select * from user_mess right join department on user_mess.depart_id = department.id; 输出结果: +------+------+-----------+----+-------+ | id | name | depart_id | id | title | +------+------+-----------+----+-------+ | 2 | 小港 | 1 | 1 | 财务 | | 1 | 小费 | 1 | 1 | 财务 | | 3 | 小干 | 2 | 2 | 公关 | | NULL | NULL | NULL | 3 | 测试 | | 4 | 小刚 | 4 | 4 | 运维 | +------+------+-----------+----+-------+ 5 rows in set (0.00 sec)
语法:
# 经查找发现 MySQL 是不支持所谓 tb_left full join tb_right 语作为 全外连接查询的,想要实现全外连接查询可以通过 union 实现,union 操作符用于合并两个或多个 SELECT 语句的结果集,语句如下: select * from tb_left left join tb_right on tb_left.id = tb_right.id union select * from tb_left right join tb_right on tb_left.id = tb_right.id ;栗子:
select * from user_mess left join department on user_mess.depart_id = department.id union select * from user_mess right join department on user_mess.depart_id = department.id; 输出结果: +------+------+-----------+------+-------+ | id | name | depart_id | id | title | +------+------+-----------+------+-------+ | 1 | 小费 | 1 | 1 | 财务 | | 2 | 小港 | 1 | 1 | 财务 | | 3 | 小干 | 2 | 2 | 公关 | | 4 | 小刚 | 4 | 4 | 运维 | | NULL | NULL | NULL | 3 | 测试 | +------+------+-----------+------+-------+ 5 rows in set (0.00 sec)值得注意的是:注:当 union 和 all 一起使用时(即 union all ),重复的行不会去除。
栗子:
select * from user_mess left join department on user_mess.depart_id = department.id union all select * from user_mess right join department on user_mess.depart_id = department.id; 输出结果: +------+------+-----------+------+-------+ | id | name | depart_id | id | title | +------+------+-----------+------+-------+ | 1 | 小费 | 1 | 1 | 财务 | | 2 | 小港 | 1 | 1 | 财务 | | 3 | 小干 | 2 | 2 | 公关 | | 4 | 小刚 | 4 | 4 | 运维 | | 2 | 小港 | 1 | 1 | 财务 | | 1 | 小费 | 1 | 1 | 财务 | | 3 | 小干 | 2 | 2 | 公关 | | NULL | NULL | NULL | 3 | 测试 | | 4 | 小刚 | 4 | 4 | 运维 | +------+------+-----------+------+-------+ 9 rows in set (0.00 sec)
概念:
交错连接 语法:tb1 cross join tb2 ;交错连接可以加查询条件,也可以不加查询条件,如果不加查询条件会形成 笛卡尔积,类似内连接效果,同样可以使用 using 语句优化字段。
栗子:
select * from user_mess cross join department; 输出结果: +----+------+-----------+----+-------+ | id | name | depart_id | id | title | +----+------+-----------+----+-------+ | 4 | 小刚 | 4 | 1 | 财务 | | 3 | 小干 | 2 | 1 | 财务 | | 2 | 小港 | 1 | 1 | 财务 | | 1 | 小费 | 1 | 1 | 财务 | | 4 | 小刚 | 4 | 2 | 公关 | | 3 | 小干 | 2 | 2 | 公关 | | 2 | 小港 | 1 | 2 | 公关 | | 1 | 小费 | 1 | 2 | 公关 | | 4 | 小刚 | 4 | 3 | 测试 | | 3 | 小干 | 2 | 3 | 测试 | | 2 | 小港 | 1 | 3 | 测试 | | 1 | 小费 | 1 | 3 | 测试 | | 4 | 小刚 | 4 | 4 | 运维 | | 3 | 小干 | 2 | 4 | 运维 | | 2 | 小港 | 1 | 4 | 运维 | | 1 | 小费 | 1 | 4 | 运维 | +----+------+-----------+----+-------+ 16 rows in set (0.00 sec)
1、内连接和交叉连接是十分相似的,只是语句语法有所不同,但最后查询出来的结果集的效果都是一样的,添加条件查询就只查询匹配条件的行,不添加条件查询则形成 笛卡尔积(生成重复多行) 而降低效率。
2、左连接以左边表为基础表 显示所有行 ,右边表条件匹配的行显示,不匹配的则有 Null 代替。
3、右连接以右边表为基础表 显示所有行 ,左边表条件匹配的行显示,不匹配的则有 Null 代替。
恭喜你看到了最后,现在看了这么多,不如赶快网上找些题目自己动手实践一波撒?。
不知道在哪找?放心我帮你找好了?。
? 【MySQL练习题】复制链接打开阿里云盘就行了:https://www.aliyundrive.com/s/D24NKjfNpTW
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?
我想使用部分字符串搜索数组,然后获取找到该字符串的索引。例如:a=["Thisisline1","Wehaveline2here","andfinallyline3","potato"]a.index("potato")#thisreturns3a.index("Wehave")#thisreturnsnil使用a.grep将返回完整的字符串,使用a.any?将返回正确的true/false语句,但都不会返回匹配的索引找到了,或者至少我不知道该怎么做。我正在编写一段代码,该代码读取文件、查找特定header,然后返回该header的索引,以便它可以将其用作future搜索的偏移量。如果
K伙计们,所以我创建了这个赞成/反对的投票脚本(基本上就像stackoverflow上的那个),我试图向其中添加一些Ajax,这样页面就不会在您每次投票时都重新加载。我有两个Controller,一个叫grinder,一个叫votes。(磨床基本都是帖子)所以这是所有研磨机的索引(看起来像这样)这是该页面的代码。Listinggrinders"grinders/grinders")%>这就是我在views/grinders/_grinders.erb中的内容true)do|u|%>grinder.id%>"up"%>'create')%>true)do|d|%>grinder.id%>
我正在尝试绕过rails配置这个极其复杂的迷宫。到目前为止,我设法在ubuntu上设置了rvm(出于某种原因,ruby在ubuntu存储库中已经过时了)。我设法建立了一个Rails项目。我希望我的测试项目使用mysql而不是mysqlite。当我尝试“rakedb:migrate”时,出现错误:“!!!缺少mysql2gem。将其添加到您的Gemfile:gem'mysql2'”当我尝试“geminstallmysql”时,出现错误,告诉我需要为安装命令提供参数。但是,参数列表很大,我不知道该选择哪些。如何通过在ubuntu上运行的rvm和mysql获取rails3?谢谢。
我的感觉是Camping和Sinatra之间的差异不是很大,您可以安全地选择其中任何一个并且没问题。但我想问问Ruby专家,这是不是真的。Sinatra和Camping微框架之间实际上有什么重要区别吗?您将如何决定使用哪一个? 最佳答案 我知道的唯一显着区别是Camping像Rails一样基于MVC模式,并且与ActiveRecord耦合。Sinatra更加不可知。Camping也不再维护,而Sinatra正在积极开发中。仅这一点就足以让我们先看看Sinatra。编辑:感谢Philippe的更正,很高兴听到Camping的开发正在进
我将restclient用于多部分表单,以将数据发送到restfulweb服务(它是Panda视频编码服务)。不过,诀窍在于我传递给restclient(Technoweenie分支)的文件来自用户提交的我自己的表单。那么,让我们来看看这个。用户将文件发布到我的Rails应用程序。在我的Controller中,它从params[:file]接收文件。然后我想使用RestClient将params[:file]传递给Panda。我在Panda服务器上遇到的错误如下。我注意到堆栈跟踪中的文件参数也在一个字符串中(我假设Panda将其转换为字符串以获得更好的堆栈跟踪)。~Startedreq
我在标准rails2.1项目中使用Test/Unit。我希望能够独立于任何特定的Controller/操作来测试分部View。好像ZenTest'sTest::Rails::ViewTestCase会有所帮助,但我无法让它工作,与view_testhttp://www.continuousthinking.com/tags/view_test类似Google出现的大部分内容似乎都已经过时了,所以我猜它并不真正适用于Rails2.1非常感谢任何帮助。谢谢,罗兰 最佳答案 我们正在使用RSpec在我们的Rails2.1项目中,我们可以做