在Docker中使用MySQL的教程

长期休眠中 分享 时间: 收藏本文

【简介】感谢网友“长期休眠中”参与投稿,下面是小编收集整理的在Docker中使用MySQL的教程(共9篇),供大家参考借鉴,欢迎大家分享。

篇1:在Docker中使用MySQL的教程

这篇文章主要介绍了在Docker中使用MySQL的教程,介绍了简单的内部搭建步骤,需要的朋友可以参考下

提及虚拟化技术,我可是linuxContainer(LXC)的热爱者,但随着Docker技术的声名鹊起,我想在这展示一下如何使用带有Docker的Mysql

Docker是什么?

实际上,Docker就是LXC的封装。使用起来很有意思。Docker采用LXC来虚拟化每个应用。所以在接下来的示例中,我们会启动chroot环境中一个被封装在自己命名空间内的mysql实例(你也可以设置Cgroups对应的资源)使用Docker的一个亮点就是统一文件系统(aufs)。所以当启动一个Docker容器后,它会记录其aufs总数并只会更新新写入的数据。

Aufs对于大多数应用来说十分有用,并且也能很好地支持数据库测试。在这我只想做个简单的示例-仅仅抛砖引玉,实用性也许并不高- Dockerfile. Dockerfile是Docker镜像的构建脚本

咱们来看看Dockerfile的内容:

FROM ubuntuMAINTAINER erkan yanar ENV DEBIAN_FRONTEND noninteractiveRUN apt-get install -y python-software-propertiesRUN apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943dbRUN add-apt-repository ‘deb mirror2.hs-esslingen.de/mariadb/repo/10.0/ubuntu precise main‘RUN apt-get updateRUN apt-get install -y mariadb-serverRUN echo “[mysqld]”>/etc/mysql/conf.d/docker.cnfRUN echo “bind-address = 0.0.0.0” >>/etc/mysql/conf.d/docker.cnfRUN echo “innodb_flush_method = O_DSYNC” >>/etc/mysql/conf.d/docker.cnfRUN echo “skip-name-resolve” >>/etc/mysql/conf.d/docker.cnfRUN echo “init_file = /etc/mysql/init” >>/etc/mysql/conf.d/docker.cnfRUN echo “GRANT ALL ON *.* TO supa@‘%‘ IDENTIFIED BY ‘supa‘;” >/etc/mysql/init EXPOSE 3306USER mysqlENTRYPOINT mysqld

你可以按自己的需求更改,

明白了大意后,可以进一步优化代码。比如,较少运行步骤:)

运行一下看看 (命名为mysql)

>cat $DOCKERFILENAME | docker build -t mysql -

很好!启动51个容器看看:

>time for i in $(seq 10 60 ) ; do docker run -d -p 50$i:3306 mysql ; done .. real 0m27.446suser 0m0.264ssys 0m0.211s

这都是在我笔记本上的结果. 如果使用KVM性能会更好 :)

>docker ps | grep mysqld |wc -l 51>docker ps | head -2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6d3a5181cd56 mysql:latest /bin/sh -c mysqld About a minute ago Up About a minute 0.0.0.0:5060->3306/tcp lonely_pare

快来试试吧 \\o/

篇2:在Lua程序中使用MySQL的教程

这篇文章主要介绍了在Lua程序中使用MySQL的教程,是Lua入门学习中的基础知识,需要的朋友可以参考下

导入MySQL

我们可以用一个简单语句导入SQLite库,假设Lua中正确实现并已完成,在安装过程中,文件夹libsql包含数据库相关的文件。

代码如下:

mysql = require “luasql.mysql”

可变的MySQL将提供通过参照主MySQL表访问该功能。

建立连接

我们可以设立一个启动MySQL的环境,然后创建环境的连接。如下所示。

代码如下:

local env = mysql.mysql

local conn = env:connect(‘test‘,‘root‘,‘123456‘)

上面的连接将连接到现有的MySQL文件并建立与新创建的文件的连接。

执行函数

这将有助于我们做的创建,插入,删除,更新等,所有的数据库操作执行简单的功能。语法如下所示

代码如下:

conn:execute([[ ‘MySQLSTATEMENT‘ ]])

在上面的语法,我们需要确保conn是开放的和现有的MySQL连接并替换“MySQLSTATEMENT”使用正确的语句。

创建表的例子

一个简单的创建表的示例如下所示。它创建类型为int和varchar类型,两个参数ID和name的表。

代码如下:

mysql = require “luasql.mysql”

local env = mysql.mysql()

local conn = env:connect(‘test‘,‘root‘,‘123456‘)

print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample2 (id INTEGER, name TEXT);]])

print(status,errorString )

当运行上面的程序,表名为sample将有两列分别是id和name会被创建。

代码如下:

MySQL environment (004BB178) MySQL connection (004BE3C8)

0 nil

如果有错误,会返回nil的错误语句。下面一个简单的错误语句如下所示。

代码如下:

LuaSQL: Error executing query. MySQL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘“id INTEGER, name TEXT)‘ at line 1

Insert语句的例子

MySQL的INSERT语句如下所示。

代码如下:

conn:execute([[INSERT INTO sample values(‘11‘,‘Raj‘)]])

Update语句的例子

对于MySQL UPDATE语句如下所示。

代码如下:

conn:execute([[UPDATE sample3 SET name=‘John‘ where id =‘12‘]])

删除Delete 语句的例子

DELETE语句-MySQL如下所示。

代码如下:

conn:execute([[DELETE from sample3 where id =‘12‘]])

Select语句的例子

就select语句而言,我们需要遍历每一行,并提取所需的数据。下面简单的SELECT语句如下所示。

代码如下:

cursor,errorString = conn:execute([[select * from sample]])

row = cursor:fetch ({}, ”a“)

while row do

print(string.format(”Id: %s, Name: %s“, row.id, row.name))

-- reusing the table of results

row = cursor:fetch (row, ”a“)

end

在上面的代码中,conn 是一个开放的MySQL连接,

由执行语句返回游标,可以通过表的反应返回获取所需的选择数据。

一个完整的例子

所有上述声明一个完整的例子给出下面的参考。

代码如下:

mysql = require ”luasql.mysql“

local env = mysql.mysql()

local conn = env:connect(‘test‘,‘root‘,‘123456‘)

print(env,conn)

status,errorString = conn:execute([[CREATE TABLE sample3 (id INTEGER, name TEXT)]])

print(status,errorString )

status,errorString = conn:execute([[INSERT INTO sample3 values(‘12‘,‘Raj‘)]])

print(status,errorString )

cursor,errorString = conn:execute([[select * from sample3]])

print(cursor,errorString)

row = cursor:fetch ({}, ”a“)

while row do

print(string.format(”Id: %s, Name: %s“, row.id, row.name))

row = cursor:fetch (row, ”a“)

end

-- close everything

cursor:close()

conn:close()

env:close()

当运行上面的程序,会得到如下的输出。

代码如下:

MySQL environment (0037B178) MySQL connection (0037EBA8)

0 nil

1 nil

MySQL cursor (003778A8) nil

Id: 12, Name: Raj

执行事务:

事务是确保数据一致性的机制。事务应该具有以下四个特性:

原子性:事务要么都完成或都没有任何变化发生。

一致性:事务必须启动一个一致的状态,让系统处于一致的状态。

隔离:一个事务的中间结果是不是当前事务外可见。

持久性:当一个事务被提交,这个效果是持久的,即使在系统出现故障。

事务开始START TRANSACTION;和commit或rollback语句结束。

开始事务

为了启动一个事务,我们需要执行在Lua下面执行语句,假设conn是一个开放的MySQL连接。

代码如下:

conn:execute([[START TRANSACTION;]])

回滚事务

我们需要做执行下面的语句来回滚执行开始事务后所做的更改。

代码如下:

conn:execute([[ROLLBACK;]])

提交事务

我们需要做执行以下语句提交执行开始事务后所做的更改。

代码如下:

conn:execute([[COMMIT;]])

我们已经在上面知道关于MySQL和下节介绍基本的SQL操作。请记住事务,但sqlite3不会再解释了,但相同的语句在sqlite3也能正常工作。

篇3:怎样在vc、delphi中使用mysql数据库教程

怎样在vc、delphi、vb等程序中使用mysql呢(mysql odbc驱动程序的使用)?我们经常会遇到这样问题,怎样在非web程序或asp程序中使用mysql数据库呢?对于这个问题有两个解决方案:

1、使用mysql提供的api函数库,

很多有名的mysql客户端工具就是这样实现的,大名鼎鼎的winmysql工具就是这样的。这在大部分的开发工具中都可以实现。

比如vc,bcb,delphi,vb等,只要能调用第三方的api就能实现。但对程序员的要求很高,而且要熟悉一套mysql的api函数集,这不是对每个人都 很轻松的事。而且这种方法不能用于asp等程序,因为它不支持com对象。

2、第二种是使用myodbc驱动程序。

你可以到www.mysql.com下载myodbc驱动程序,然后照着下面的做就可以了 第一种选择是下载完全安装包,这种包很大,但对于我们来说有用的只有myodbc.dll这个文件,却要下载这么大的文件,不太合适。当然,如果你 很菜的话,我建议你选择这种方式,这样容易些,但不符合cfans的作风,是吧。

第二种是直接下载myodbc.dll文件,只有几百k,但不太容易使用,本人经过很久摸索才找到使用它的方法。

首先你将包解开,将myodbc.dll 文件放到windowssystem 或 winntsystem32目录下,这取决于你的系统是win9x还是winnt(win2k),你应该 知道吧。然后打开一纯文本编辑器,如editplus,notpad之类,(取决于你的喜好)将下面一段话保存为一文件,扩展名为.reg,知道了吧,这是注册表文件,不要搞错呀(不包括下面的一长串等号) 如果你用的是win2k请将第一行换成 Windows Registry Editor Version 5.00

==========================================================从下行开始

Windows Registry Editor Version 4.00

[HKEY_LOCAL_MACHINESOFTWAREODBCODBCINST.INImyodbc driver]

”UsageCount“=dword:00000002

”Driver“=”C:\\WINNT\\System32\\myodbc.dll“

”Setup“=”C:\\WINNT\\System32\\myodbc.dll“

”SQLLevel“=”1“

”FileUsage“=”0“

”DriverODBCVer“=”02.50“

”ConnectFunctions“=”YYY“

”APILevel“=”1“

”CpTimeout“=”120“

[HKEY_LOCAL_MACHINESOFTWAREODBCODBCINST.INIODBC Drivers]

”myodbc driver“=”installed“

=======================================结束于上一行

(bill.gates)就这样吧.保存后,双击刚才的文件,应该叫 xxx.reg 吧,然后选择确定,ok,搞定了,

然后你打开odbc设置程序,建一新数据源,选择myodbc驱动程序,剩下的就看你自己了。

篇4:Linux中Docker安装后如何使用Docker容器

Docker的安装在之前的文章中有介绍过,不少朋友在安装后不知要如何使用Docker容器,下面以图文的形式为大家介绍下如何使用

1.启动一个Docker容器

[root@localhost ~]# docker run -i -t Ubuntu /bin/bash

Unable to find image ‘ubuntu’ locally

Pulling repository ubuntu

04c5d3b7b065: Download complete

511136ea3c5a: Download complete

c7b7c6419568: Download complete

70c8faa62a44: Download complete

d735006ad9c1: Download complete

Status: Downloaded newer image for ubuntu:latest

注:

-i:打开容器中的STDIN

-t:为容器分配一个伪tty终端

从上面我们可以看出,首先Docker会检查本地是否存在ubuntu镜像,如果在本地没有找到该镜像的话,那么Docker就会去官方的Docker Hub Registry查看Docker Hub中是否有该镜像。Docker一旦找到该镜像,就会下载该镜像并将其保存到本地的宿主机中。

然后,Docker在文件系统内部用这个镜像创建了一个新的容器。该容器拥有自己的网络、IP地址,以及一个用来可以和宿主机进行通信的桥接网络接口。最后,我们告诉Docker在新容器中要运行什么命令。

当容器创建完毕之后,Docker就会执行容器中的/bin/bash命令。这时间我们就可以看到容器内的shell

root@8c342c0c275c:/#

注:8c342c0c275c代表容器的ID

2.使用容器

查看该容器的主机名

root@8c342c0c275c:/# hostname

8c342c0c275c

可以看到,容器的主机名就是该容器的ID

查看该主机的hosts文件

root@8c342c0c275c:/# cat /etc/hosts

172.17.0.2 8c342c0c275c

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

127.0.0.1 localhost

::1 localhost ip6-localhost ip6-loopback

fe00::0 ip6-localnet

可以看到Docker为该容器的IP地址添加了一条主机配置项。

查看该容器的IP地址

root@8c342c0c275c:/# ip a

1: lo: 《LOOPBACK,UP,LOWER_UP》 mtu 65536 qdisc noqueue state UNKNOWN group default

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

4: eth0: 《BROADCAST,UP,LOWER_UP》 mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff

inet 172.17.0.2/16 scope global eth0

valid_lft forever preferred_lft forever

inet6 fe80::42:acff:fe11:2/64 scope link

valid_lft forever preferred_lft forever

查看容器中运行的进程

root@8c342c0c275c:/# ps -aux

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 1 0.0 0.1 18168 1976 ? Ss 09:38 0:00 /bin/bash

root 19 0.0 0.0 15568 1144 ? R+ 09:55 0:00 ps -aux

在容器中安装一个软件包

root@8c342c0c275c:/# apt-get update && apt-get install vim

Ign archive.ubuntu.com trusty InRelease

Ign archive.ubuntu.com trusty-updates InRelease

Ign archive.ubuntu.com trusty-security InRelease

Hit archive.ubuntu.com trusty Release.gpg

Get:1 archive.ubuntu.com trusty-updates Release.gpg [933 B]

Get:2 archive.ubuntu.com trusty-security Release.gpg [933 B]

Hit archive.ubuntu.com trusty Release

Get:3 archive.ubuntu.com trusty-updates Release [62.0 kB]

Get:4 archive.ubuntu.com trusty-security Release [62.0 kB]

Get:5 archive.ubuntu.com trusty/main Sources [1335 kB]

Get:6 archive.ubuntu.com trusty/restricted Sources [5335 B]

Get:7 archive.ubuntu.com trusty/universe Sources [7926 kB]

Get:8 archive.ubuntu.com trusty/main amd64 Packages [1743 kB]

Get:9 archive.ubuntu.com trusty/restricted amd64 Packages [16.0 kB]

Get:10 archive.ubuntu.com trusty/universe amd64 Packages [7589 kB]

Get:11 archive.ubuntu.com trusty-updates/main Sources [193 kB]

Get:12 archive.ubuntu.com trusty-updates/restricted Sources [1874 B]

Get:13 archive.ubuntu.com trusty-updates/universe Sources [119 kB]

Get:14 archive.ubuntu.com trusty-updates/main amd64 Packages [493 kB]

Get:15 archive.ubuntu.com trusty-updates/restricted amd64 Packages [14.8 kB]

Get:16 archive.ubuntu.com trusty-updates/universe amd64 Packages [298 kB]

Get:17 archive.ubuntu.com trusty-security/main Sources [70.1 kB]

Get:18 archive.ubuntu.com trusty-security/restricted Sources [1874 B]

Get:19 archive.ubuntu.com trusty-security/universe Sources [19.1 kB]

Get:20 archive.ubuntu.com trusty-security/main amd64 Packages [229 kB]

Get:21 archive.ubuntu.com trusty-security/restricted amd64 Packages [14.8 kB]

Get:22 archive.ubuntu.com trusty-security/universe amd64 Packages [98.1 kB]

Fetched 20.3 MB in 41s (490 kB/s)

Reading package lists.。。 Done

Reading package lists.。。 Done

Building dependency tree

Reading state information.,

。 Done

The following extra packages will be installed:

libgpm2 libpython2.7 libpython2.7-minimal libpython2.7-stdlib vim-runtime

Suggested packages:

gpm ctags vim-doc vim-scripts

The following NEW packages will be installed:

libgpm2 libpython2.7 libpython2.7-minimal libpython2.7-stdlib vim

vim-runtime

0 upgraded, 6 newly installed, 0 to remove and 2 not upgraded.

Need to get 9083 kB of archives.

After this operation, 42.9 MB of additional disk space will be used.

Do you want to continue? [Y/n] y

Get:1 archive.ubuntu.com/ubuntu/ trusty/main libgpm2 amd64 1.20.4-6.1 [16.5 kB]

Get:2 archive.ubuntu.com/ubuntu/ trusty/main libpython2.7-minimal amd64 2.7.6-8 [307 kB]

Get:3 archive.ubuntu.com/ubuntu/ trusty/main libpython2.7-stdlib amd64 2.7.6-8 [1872 kB]

Get:4 archive.ubuntu.com/ubuntu/ trusty/main libpython2.7 amd64 2.7.6-8 [1044 kB]

Get:5 archive.ubuntu.com/ubuntu/ trusty/main vim-runtime all 2:7.4.052-1ubuntu3 [4888 kB]

Get:6 archive.ubuntu.com/ubuntu/ trusty/main vim amd64 2:7.4.052-1ubuntu3 [956 kB]

Fetched 9083 kB in 51s (175 kB/s)

Selecting previously unselected package libgpm2:amd64.

(Reading database 。。。 11527 files and directories currently installed.)

Preparing to unpack 。。。/libgpm2_1.20.4-6.1_amd64.deb 。。。

Unpacking libgpm2:amd64 (1.20.4-6.1) 。。。

Selecting previously unselected package libpython2.7-minimal:amd64.

Preparing to unpack 。。。/libpython2.7-minimal_2.7.6-8_amd64.deb 。。。

Unpacking libpython2.7-minimal:amd64 (2.7.6-8) 。。。

Selecting previously unselected package libpython2.7-stdlib:amd64.

Preparing to unpack 。。。/libpython2.7-stdlib_2.7.6-8_amd64.deb 。。。

Unpacking libpython2.7-stdlib:amd64 (2.7.6-8) 。。。

Selecting previously unselected package libpython2.7:amd64.

Preparing to unpack 。。。/libpython2.7_2.7.6-8_amd64.deb 。。。

Unpacking libpython2.7:amd64 (2.7.6-8) 。。。

Selecting previously unselected package vim-runtime.

Preparing to unpack 。。。/vim-runtime_2%3a7.4.052-1ubuntu3_all.deb 。。。

Adding ‘diversion of /usr/share/vim/vim74/doc/help.txt to /usr/share/vim/vim74/doc/help.txt.vim-tiny by vim-runtime’

Adding ‘diversion of /usr/share/vim/vim74/doc/tags to /usr/share/vim/vim74/doc/tags.vim-tiny by vim-runtime’

Unpacking vim-runtime (2:7.4.052-1ubuntu3) 。。。

Selecting previously unselected package vim.

Preparing to unpack 。。。/vim_2%3a7.4.052-1ubuntu3_amd64.deb 。。。

Unpacking vim (2:7.4.052-1ubuntu3) 。。。

Setting up libgpm2:amd64 (1.20.4-6.1) 。。。

Setting up libpython2.7-minimal:amd64 (2.7.6-8) 。。。

Setting up libpython2.7-stdlib:amd64 (2.7.6-8) 。。。

Setting up libpython2.7:amd64 (2.7.6-8) 。。。

Setting up vim-runtime (2:7.4.052-1ubuntu3) 。。。

Processing /usr/share/vim/addons/doc

Setting up vim (2:7.4.052-1ubuntu3) 。。。

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vim (vim) in auto mode

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vimdiff (vimdiff) in auto mode

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/rvim (rvim) in auto mode

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/rview (rview) in auto mode

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vi (vi) in auto mode

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/view (view) in auto mode

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/ex (ex) in auto mode

update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/editor (editor) in auto mode

Processing triggers for libc-bin (2.19-0ubuntu6.4) 。。。

退出容器

root@8c342c0c275c:/# exit

exit

当我们输入exit后,容器就停止工作了。只有在指定的/bin/bash命令处于运行状态的时间,容器才会相应地处于运行状态。一旦退出容器,/bin/bash命令也就结束了,这时容器也就停止了。

查看系统中容器的列表

[root@localhost ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

8c342c0c275c ubuntu:latest “/bin/bash” 26 minutes ago Exited (0) 5 minutes ago sharp_bohr

8c342c0c275c:代表容器的ID,

ubuntu:latest :创建容器的镜像

“/bin/bash” :容器最后执行的命令

26 minutes ago :创建时间

Exited (0) 5 minutes :容器退出的状态

sharp_bohr :容器的名称

Docker中容器的命名

Docker在创建容器时会自动为容器生成一个随机的名称。那么如果我们想在创建一个容器时指定该容器的名称可以使用如下命令:

[root@localhost ~]# docker run --name ovcer_the_container -i -t ubuntu /bin/bash

root@1ce9f640478d:/#

上面的命令将会创建一个名为ovcer_the_container的容器。对于一个合法的容器的名称来说只可以包括以下字符:小写字母a~z、大写字母A-Z、数字0~9、下划线、圆点、横线。

上面就是Linux使用Docker容器的方法介绍了,在使用命令创建Docker容器后,就可以使用命令对Docker容器进行命名了。

篇5:怎样在vc、delphi中使用mysql

我们经常会遇到这样问题,怎样在非web程序或asp程序中使用mysql数据库呢?对于这个问题有两个解决方案:

1.使用mysql提供的api函数库,

很多有名的mysql客户端工具就是这样实现的,大名鼎鼎的winmysql工具就是这样的。这在大部分的开发工具中都可以实现。

比如vc,bcb,delphi,vb等,只要能调用第三方的api就能实现。但对程序员的要求很高,而且要熟悉一套mysql的api函数集,这不是对每个人都很轻松的事。而且这种方法不能用于asp等程序,因为它不支持com对象。

2。第二种是使用myodbc驱动程序。

你可以到www.mysql.com下载myodbc驱动程序,然后照着下面的做就可以了

第一种选择是下载完全安装包,这种包很大,但对于我们来说有用的只有myodbc.dll这个文件,却要下载这么大的文件,不太合适。当然,如果你很菜的话,我建议你选择这种方式,这样容易些,但不符合cfans的作风,是吧。

第二种是直接下载myodbc.dll文件,只有几百k,但不太容易使用,本人经过很久摸索才找到使用它的方法。

首先你将包解开,将myodbc.dll 文件放到windowssystem 或 winntsystem32目录下,这取决于你的系统是win9x还是winnt(win2k),你应该知道吧。

然后打开一纯文本编辑器,如editplus,notpad之类,(取决于你的喜好)将下面一段话保存为一文件,扩展名为.reg,知道了吧,这是注册表文件,不要搞错呀(不包括下面的一长串等号)

如果你用的是win2k请将第一行换成

Windows Registry Editor Version 5.00

==========================================================从下行开始

Windows Registry Editor Version 4.00

[HKEY_LOCAL_MACHINESOFTWAREODBCODBCINST.INImyodbc driver]

”UsageCount“=dword:00000002

”Driver“=”C:\\WINNT\\System32\\myodbc.dll“

”Setup“=”C:\\WINNT\\System32\\myodbc.dll“

”SQLLevel“=”1“

”FileUsage“=”0“

”DriverODBCVer“=”02.50“

”ConnectFunctions“=”YYY“

”APILevel“=”1“

”CpTimeout“=”120“

[HKEY_LOCAL_MACHINESOFTWAREODBCODBCINST.INIODBC Drivers]

”myodbc driver“=”installed“

=======================================结束于上一行

至于为什么要写这些,你就不要问我了,我也不想回答,这是收费门先生说了算的(bill.gates)就这样吧.保存后,双击刚才的文件,应该叫

xxx.reg 吧,然后选择确定,ok,搞定了,

然后你打开odbc设置程序,建一新数据源,选择myodbc驱动程序,剩下的就看你自己了。===============================================================

篇6:在Docker中自动化部署Ruby on Rails的教程

作者:Michelangelo Chasseur 字体:[增加 减小] 类型:

这篇文章主要介绍了在Docker中部署Ruby on Rails的教程,Docker是当下最火的虚拟机,而本文所介绍的Ruby on Rails的部署则充分利用了Ruby中的rake这一炫酷的实现自动化的方法,需要的朋友可以参考下

基本的Rails应用程序

现在让我们启动一个基本的Rails应用,为了更好的展示,我使用Ruby 2.2.0和Rails 4.1.1

在终端运行:

$ rvm use 2.2.0 $ rails new && cd docker-test

创建一个基本的控制器:

$ rails g controller welcome index

……,然后编辑 routes.rb ,以便让该项目的根指向我们新创建的welcome#index方法:

root ‘welcome#index‘

在终端运行 rails s ,然后打开浏览器,登录localhost:3000,你会进入到索引界面当中。我们不准备给应用加上多么神奇的东西,这只是一个基础的实例,当我们将要创建并部署容器的时候,用它来验证一切是否运行正常。

安装webserver

我们打算使用Unicorn当做我们的webserver。在Gemfile中添加 gem ‘unicorn‘和 gem ‘foreman‘然后将它bundle起来(运行 bundle install命令)。

启动Rails应用时,需要先配置好Unicorn,所以我们将一个unicorn.rb文件放在config目录下。这里有一个Unicorn配置文件的例子,你可以直接复制粘贴Gist的内容。

接下来,在项目的根目录下添加一个Procfile,以便可以使用foreman启动应用,内容为下:

代码如下:

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb

现在运行foreman start命令启动应用,一切都将正常运行,并且你将能够在localhost:5000上看到一个正在运行的应用。

构建一个Docker镜像

现在我们构建一个镜像来运行我们的应用。在这个Rails项目的根目录下,创建一个名为Dockerfile的文件,然后粘贴进以下内容:

代码如下:

# 基于镜像 ruby 2.2.0

FROM ruby:2.2.0

# 安装所需的库和依赖

RUN apt-get update && apt-get install -qy nodejs postgresql-client sqlite3 --no-install-recommends && rm -rf /var/lib/apt/lists/*

# 设置 Rails 版本

ENV RAILS_VERSION 4.1.1

# 安装 Rails

RUN gem install rails --version ”$RAILS_VERSION“

# 创建代码所运行的目录

RUN mkdir -p /usr/src/app

WORKDIR /usr/src/app

# 使 webserver 可以在容器外面访问

EXPOSE 3000

# 设置环境变量

ENV PORT=3000

# 启动 web 应用

CMD [”foreman“,”start“]

# 安装所需的 gems

ADD Gemfile /usr/src/app/Gemfile

ADD Gemfile.lock /usr/src/app/Gemfile.lock

RUN bundle install --without development test

# 将 rails 项目(和 Dockerfile 同一个目录)添加到项目目录

ADD ./ /usr/src/app

# 运行 rake 任务

RUN RAILS_ENV=production rake db:create db:migrate

使用上述Dockerfile,执行下列命令创建一个镜像(确保boot2docker已经启动并在运行当中):

$ docker build -t localhost:5000/your_username/docker-test .

然后,如果一切正常,长长的日志输出的最后一行应该类似于:

Successfully built 82e48769506c $ docker images REPOSITORY TAG IMAGE IDCREATED VIRTUAL SIZE localhost:5000/your_username/docker-test latest 82e48769506c About a minute ago 884.2 MB

让我们运行一下容器试试!

$ docker run -d -p 3000:3000 --name docker-test localhost:5000/your_username/docker-test

通过你的boot2docker虚拟机的3000号端口(我的是192.168.59.103:3000),你可以观察你的Rails应用。(如果不清楚你的boot2docker虚拟地址,输入$ boot2docker ip命令查看。)

使用shell脚本进行自动化部署

前面的文章(指文章1和文章2)已经告诉了你如何将新创建的镜像推送到私有registry中,并将其部署在服务器上,所以我们跳过这一部分直接开始自动化进程,

我们将要定义3个shell脚本,然后最后使用rake将它们捆绑在一起。

清除

每当我们创建镜像的时候,

停止并重启boot2docker;

去除Docker孤儿镜像(那些没有标签,并且不再被容器所使用的镜像们)。

在你的工程根目录下的clean.sh文件中输入下列命令。

代码如下:

echo Restarting boot2docker...

boot2docker down

boot2docker up

echo Exporting Docker variables...

sleep 1

export DOCKER_HOST=tcp://192.168.59.103:2376

export DOCKER_CERT_PATH=/Users/user/.boot2docker/certs/boot2docker-vm

export DOCKER_TLS_VERIFY=1

sleep 1

echo Removing orphaned images without tags...

docker images | grep ”“ | awk ‘{print $3}‘ | xargs docker rmi

给脚本加上执行权限:

$ chmod +x clean.sh

构建

构建的过程基本上和之前我们所做的(docker build)内容相似。在工程的根目录下创建一个build.sh脚本,填写如下内容:

代码如下:

docker build -t localhost:5000/your_username/docker-test .

记得给脚本执行权限。

部署

最后,创建一个deploy.sh脚本,在里面填进如下内容:

代码如下:

# 打开 boot2docker 到私有注册库的 SSH 连接

boot2docker ssh ”ssh -o ‘StrictHostKeyChecking no‘ -i /Users/username/.ssh/id_boot2docker -N -L 5000:localhost:5000 root@your-registry.com &“ &

# 在推送前先确认该 SSH 通道是开放的。

echo Waiting 5 seconds before pushing image.

echo 5...

sleep 1

echo 4...

sleep 1

echo 3...

sleep 1

echo 2...

sleep 1

echo 1...

sleep 1

# Push image onto remote registry / repo

echo Starting push!

docker push localhost:5000/username/docker-test

如果你不理解这其中的含义,请先仔细阅读这部分第二部分。

给脚本加上执行权限。

使用rake将以上所有绑定

现在的情况是,每次你想要部署你的应用时,你都需要单独运行这三个脚本。

clean

build

deploy / push

这一点都不费工夫,可是事实上开发者比你想象的要懒得多!那么咱们就索性再懒一点!

我们最后再把工作好好整理一番,我们现在要将三个脚本通过rake捆绑在一起。

为了更简单一点,你可以在工程根目录下已经存在的Rakefile中添加几行代码,打开Rakefile文件,把下列内容粘贴进去。

namespace :docker do desc ”Remove docker container“ task :clean do sh ‘./clean.sh‘ end desc ”Build Docker image“ task :build =>[:clean] do sh ‘./build.sh‘ end desc ”Deploy Docker image“ task :deploy =>[:build] do sh ‘./deploy.sh‘ end end

即使你不清楚rake的语法(其实你真应该去了解一下,这玩意太酷了!),上面的内容也是很显然的吧。我们在一个命名空间(docker)里声明了三个任务。

三个任务是:

rake docker:clean

rake docker:build

rake docker:deploy

Deploy独立于build,build独立于clean。所以每次我们输入命令运行的时候。

$ rake docker:deploy

所有的脚本都会按照顺序执行。

测试

现在我们来看看是否一切正常,你只需要在app的代码里做一个小改动:

$ rake docker:deploy

接下来就是见证奇迹的时刻了。一旦镜像文件被上传(第一次可能花费较长的时间),你就可以ssh登录产品服务器,并且(通过SSH管道)把docker镜像拉取到服务器并运行了。多么简单!

也许你需要一段时间来习惯,但是一旦成功,它几乎与用Heroku部署一样简单。

备注:像往常一样,请让我了解到你的意见。我不敢保证这种方法是最好,最快,或者最安全的Docker开发的方法,但是这东西对我们确实奏效。

篇7:在Python中使用模块的教程

作者:廖雪峰 字体:[增加 减小] 类型:转载

这篇文章主要介绍了在Python中使用模块的教程,示例代码基于Python2.x版本,需要的朋友可以参考下

Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用,

我们以内建的sys模块为例,编写一个hello的模块:

#!/usr/bin/env python# -*- coding: utf-8 -*-‘ a test module ‘__author__ = ‘Michael Liao‘import sysdef test: args = sys.argv if len(args)==1: print ‘Hello, world!‘ elif len(args)==2: print ‘Hello, %s!‘ % args[1] else: print ‘Too many arguments!‘if __name__==‘__main__‘: test()

第1行和第2行是标准注释,第1行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行,第2行注释表示.py文件本身使用标准UTF-8编码;

第4行是一个字符串,表示模块的文档注释,任何模块代码的第一个字符串都被视为模块的文档注释;

第6行使用__author__变量把作者写进去,这样当你公开源代码后别人就可以瞻仰你的大名;

以上就是Python模块的标准文件模板,当然也可以全部删掉不写,但是,按标准办事肯定没错。

后面开始就是真正的代码部分。

你可能注意到了,使用sys模块的第一步,就是导入该模块:

import sys

导入sys模块后,我们就有了变量sys指向该模块,利用sys这个变量,就可以访问sys模块的所有功能。

sys模块有一个argv变量,用list存储了命令行的所有参数。argv至少有一个元素,因为第一个参数永远是该.py文件的名称,例如:

运行python hello.py获得的sys.argv就是[‘hello.py‘];

运行python hello.py Michael获得的sys.argv就是[‘hello.py‘, ‘Michael]。

最后,注意到这两行代码:

if __name__==‘__main__‘: test()

当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。

我们可以用命令行运行hello.py看看效果:

$ python hello.pyHello, world!$ python hello.py MichaelHello, Michael!

如果启动Python交互环境,再导入hello模块:

$ pythonPython 2.7.5 (default, Aug 25 , 00:04:04) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwinType ”help“, ”copyright“, ”credits“ or ”license\" for more information.>>>import hello>>>

导入时,没有打印Hello, word!,因为没有执行test()函数,

调用hello.test()时,才能打印出Hello, word!:

>>>hello.test()Hello, world!

别名

导入模块时,还可以使用别名,这样,可以在运行时根据当前环境选择最合适的模块。比如Python标准库一般会提供StringIO和cStringIO两个库,这两个库的接口和功能是一样的,但是cStringIO是C写的,速度更快,所以,你会经常看到这样的写法:

try: import cStringIO as StringIOexcept ImportError: # 导入失败会捕获到ImportError import StringIO

这样就可以优先导入cStringIO。如果有些平台不提供cStringIO,还可以降级使用StringIO。导入cStringIO时,用import ... as ...指定了别名StringIO,因此,后续代码引用StringIO即可正常工作。

还有类似simplejson这样的库,在Python 2.6之前是独立的第三方库,从2.6开始内置,所以,会有这样的写法:

try: import json # python >= 2.6except ImportError: import simplejson as json # python <= 2.5

由于Python是动态语言,函数签名一致接口就一样,因此,无论导入哪个模块后续代码都能正常工作。

作用域

在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在Python中,是通过_前缀来实现的。

正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等;

类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊变量,hello模块定义的文档注释也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名;

类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;

之所以我们说,private函数和变量“不应该”被直接引用,而不是“不能”被直接引用,是因为Python并没有一种方法可以完全限制访问private函数或变量,但是,从编程习惯上不应该引用private函数或变量。

private函数或变量不应该被别人引用,那它们有什么用呢?请看例子:

def _private_1(name): return ‘Hello, %s‘ % namedef _private_2(name): return ‘Hi, %s‘ % namedef greeting(name): if len(name) >3: return _private_1(name) else: return _private_2(name)

我们在模块里公开greeting()函数,而把内部逻辑用private函数隐藏起来了,这样,调用greeting()函数不用关心内部的private函数细节,这也是一种非常有用的代码封装和抽象的方法,即:

外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。

篇8:在Excel中使用条件格式EXCEL基本教程

自Excel 97之后,Excel具备了条件格式功能,所谓条件格式是指当指定条件为真时,Excel自动应用于单元格的格式,例如,单元格底纹或字体颜色。如果想为某些符合条件的单元格应用某种特殊格式,使用条件格式功能可以比较容易实现。如果再结合使用公式,条件格式就会变得更加有用。

应用实例:某教师想在一个工作表中突出显示期末成绩高于期中成绩的学生,实现后的工作表如图1所示。

图1

在该工作表中,有全体学生两次考试的成绩,条件格式功能将学生中期末成绩高于期中成绩的高亮显示。这种格式是动态的:如果改变考试的分数,格式会自动调整。

下面介绍具体操作步骤。

1.按图1所示创建一个工作表用于练习。

2.选择单元格A2:C11,然后选择菜单命令“格式>条件格式”,在“条件格式” 对话框中的最左边选择“公式”,然后在右侧输入框中输入下列公式(如图2所示):

=$C2>$B2

图2

3.单击“格式”按钮,打开“单元格格式”对话框,为符合条件的单元格设置格式,例如,将单元格的底纹设置为浅绿色,如图3所示,

图3

4.设置完毕单击“确定”按钮,回到原来对话框,再单击“确定”,则现在工作表如图4所示。

图4

条件格式设置中的公式会作用于所选区域,而不只是作用于第2行,这是因为在公式列参数使用了$,这样列就成了绝对引用,而行是相对引用。我们可以在其它某行(如第10行)中单击,然后选择菜单命令“格式>条件格式”,可以看到如图5所示的公式,该行使用的公式为:

=$C10>$B10

图5

至于图1中数据区域的外观与图4略有不同,是因为对这些单元格应用了黑色的边框。从本例可以看出,灵活地运用条件格式,可以帮助我们快速完成一些比较实际的任务,从而提高工作的效率。

关 键 字:EXCEL

篇9:在MySQL中实现二分查找的详细教程

这篇文章主要介绍了在MySQL中实现二分查找的详细教程,来自计算机研究生考试原题,需要的朋友可以参考下

给定一个升序排列的自然数数组,数组中包含重复数字,例如:[1,2,2,3,4,4,4,5,6,7,7],问题:给定任意自然数,对数组进行二分查找,返回数组正确的位置,给出函数实现。注:连续相同的数字,返回第一个匹配位置还是最后一个匹配位置,由函数传入参数决定。

我为什么会出这道题目?

二分查找在数据库内核实现中非常重要

在数据库的内核实现中,二分查找是一个非常重要的逻辑,几乎99%以上的SQL语句(所有索引上的范围扫描/等值查询/Unique查询等),都会使用到二分查找进行数据的定位。

考虑一个数据库表t1(a int primary key, b int),表上的b字段有一个B+树索引,表中记录的b字段取值,就是题目中的[1,2,2,3,4,4,4,5,6,7,7]序列。此时,给定以下的两条查询语句,就是使用到了不同的二分查找逻辑:

SQL1:

select * from t1 where b >4;

SQL2:

select * from t1 where b >= 4;

针对SQL1,索引的二分查找,就需要跳过所有的4,从最后一个4之后开始返回所有记录;针对SQL2,二分查找就需要定位到第一个4,然后顺序读取所有记录。

除此之外,针对数据库中其他的查询逻辑,二分查找还需要附带更多的功能,例如:

SQL3:

select * from t1 where b < 2;

SQL4:

select * from t1 where b <= 2;

由于数据库索引同时支持反向扫描,因此SQL3、SQL4的语句,都可以使用索引反向扫描。反向扫描时,SQL3需要定位到索引中的第一个2;而SQL4,则需要定位到索引的最后一个2,然后开始反向返回满足查询条件的索引记录。

二分查找在程序设计中,是一个十分基础并且易错的功能

第一个真正正确的二分查找算法,在第一个二分查找实现之后的12年,才被发表出来。通过Google,输入Binary Search或者是二分查找关键字,有大量的相关的文章或者博客讨论此话题。

二分查找实现,需要注意的问题

本文不准备详细介绍一个正确的二分查找应该是如何实现的,毕竟现在网上有着大量的正确版本。接下来,根据批改试卷过程中发现的一些问题,做一些简单的分析,希望对大家实现一个有效的二分查找算法,甚至是一个数据库内可用的二分查找算法,有所帮助。

问题一:是否检查参数的有效性

大量的试卷,在给出此问题的解决算法时,直接拿着low,high参数开始进行计算,但是却没有检查low/high参数。low/high是否相同,数组中是否存在记录?low/high构成的区间是否有效?代码的鲁棒性不足。

在数据库的二分查找实现中,一般是对一个索引页面进行二分查找。索引页面中有可能根本不存在用户的记录(索引页面中的记录全部被删除,又没有与兄弟页面合并时),此时,low/high均为0,此时如果根据low/high计算出来的mid进行记录的读取,就存在逻辑错误。

问题二:二分查找中值的计算

这是一个经典的话题,如何计算二分查找中的中值?试卷中,大家一般给出了两种计算方法:

算法一: mid = (low + high) / 2

算法二: mid = low + (high C low)/2

乍看起来,算法一简洁,算法二提取之后,跟算法一没有什么区别。但是实际上,区别是存在的。算法一的做法,在极端情况下,(low + high)存在着溢出的风险,进而得到错误的mid结果,导致程序错误。而算法二能够保证计算出来的mid,一定大于low,小于high,不存在溢出的问题。

回到数据库二分查找,数据库的一个索引页面(大小一般是8k或者是16k),能够存储的索引记录是有限的,因此肯定不会出现(low + high)溢出的风险。这也是为什么InnoDB中的中值,采用的就是算法一的实现。但是,作为一个严谨的程序设计人员,还是推荐使用算法二,将任何潜在的风险,扼杀于摇篮之中。

问题三:递归实现二分查找

超过一半的试卷,使用了递归调用的方式实现二分查找。不能说递归实现有错,而是在于实现效率问题。总所周知,递归调用存在着压栈/出栈的开销,其效率是比较低下的。而以数据库这样一个极端优化代码效率,提供快速查询响应的系统来说,效率是第一位的。不建议使用递归方式实现二分查找,至少在数据库内核实现中是不允许使用的。据我所知,所有的开源数据库系统,例如:InnoDB,PostgreSQL都未采用递归方式实现二分查找。

问题四:如何查找第一个/最后一个等值

回到题目,要求根据传入的参数不同,返回第一个/最后一个等值项。在本文的背景部分,我也解释了此问题对应的数据库查询(>,>=查询需求是不同的)。在试卷中,超过80%的同学的答案都是先进行二分查找,待定位到相同值之后,再根据传入的flag(用户需求:flag = 1,返回第一个等值项;flag = 0,返回最后一个等值项),进行顺序遍历,直至定位到满足条件的项。

同样,不能说这个实现是错的,但是也存在着性能问题。性能性能性能,永远是数据库内核实现考虑的重点之一(相信也是所有应用程序的一个指标)。数据库中,除了主键索引/Unique索引能够保证键值唯一之外,很多二级辅助索引都是存在相同键值的,有时相同键值的项会超过千项(考虑一个用户的订单,或者是购买记录)。

假设一个索引页面,保存着400项记录,均为相同键值。此时,使用先二分查找,后顺序遍历的算法,二分查找只能使用一次,顺序遍历199次,最终对比了200次。效率非常之低。当然,我也欣喜的看到另外一小部分同学的做法(我期待看到的算法),用flag来纠正每次比较的最终结果,

例如:比较相等(相等用0表示,大于为1,小于为-1),但是flag = 1,则返回纠正后的比较结果为1,需要移动二分查找的high到mid,继续二分(反之,若flag = 0,则返回纠正后的结果为-1,需要移动二分查找的low到mid,继续二分)。如此一来,等值仍旧可以进行二分查找,最终的对比只需要9次,远远小于200次。

此问题,进一步引出了下一个问题,数据库中如何实现一个通用的,更为复杂的二分查找算法?

问题五:数据库中的二分查找实现举例

数据库中的二分查找,更为复杂,需要实现一个通用型的二分查找算法,使用于各种不同的SQL查询场景。

InnoDB针对不同的SQL语句,总结出四种不同的Search Mode,分别为:

#define   PAGE_CUR_G         1       >查询

#define   PAGE_CUR_GE        2       >=,=查询

#define   PAGE_CUR_L         3       <查询>

#define   PAGE_CUR_LE        4       <=查询

然后根据这四种不同的Search Mode,在二分查找碰到相同键值时进行调整。例如:若Search Mode为PAGE_CUR_G或者是PAGE_CUR_LE,则移动low至mid,继续进行二分查找;若Search Mode为PAGE_CUR_GE或者是PAGE_CUR_L,则移动high至mid,继续进行二分查找。

我们的TNT引擎,采用了与InnoDB不同的方案,但是也实现了相同的功能。TNT引擎针对相同键值的调整总结为下图,在此我就不做解释了,大家可以尝试着自己进行分析。

/* 操作符 includeKey    forward    compare result: 1   0       -1 */

=============================================================================

>=           1           1   |           1           -1       -1

=            1           1   |           1           -1       -1

>            0           1   |           1            1       -1

<            0           0   |           1           -1       -1

<=           1           0   |           1            1       -1

=============================================================================

相关专题 教程Docker