4月7日增加北京东直门双线数据中心,5月9日增加北京石景山七线数据中心。详情 42qu ...

用 Shell 脚本访问 MySQL 数据库

下午写了一个简单的 bash 脚本,用来测试程序,输入一个测试用例文件,输出没有通过测试的用例和结果,然后把结果保存到数据库里。如何在 bash 脚本里直接访问数据库呢?既然在 shell 里可以直接用 mysql 命令操作数据库,那么在 shell script 里也应该可以通过调用 mysql 来操作数据库。比如用下面的 bash shell 脚本查询数据库:

Bash

#!/bin/bash

mysql -uvpsee -ppassword test < < EOFMYSQL
select * from test_mark;
EOFMYSQL

如果需要复杂的数据库操作的话不建议用 shell 脚本,用 Perl/Python/PHP 操作数据库很方便,分别通过 Perl DBI/Python MySQLdb/PHP MySQL Module 接口来操作数据库。这里再给出这三种不同语言连接、查询数据库的简单例子(为了简单和减少篇幅删除一些不必要的代码):

Perl

#!/usr/bin/perl
use DBI;

$db = DBI->connect('dbi:mysql:test', 'vpsee', 'password');
$query = "select * from test_mark";
$cursor = $db->prepare($query);
$cursor->execute;
while (@row = $cursor->fetchrow_array) {
        print "@row\n";
}

Python


继续阅读 »

Shell 的 IFS 变量

今天把一个 shell script 从 Linux 移植到 Solaris 时遇到一些小问题:

args=`tail -n 1 $file | head -1`

tail 的用法有点不一样。Solaris 下的 tail:tail -1 $file

IFS=”

javac $1
sort_program=`echo $1|sed ‘s/\.[^.]*$//’`
args=”2 1 3″
java $sort_program $args

上面的 script 编译一个 java 排序程序,然后用给定参数 2 1 3 运行,排序后输出 1 2 3。java 运行上面脚本时报错:

Exception in thread “main” java.lang.NumberFormatException: For input string: “2 1 3″

显然 java 把 “2 1 3” 字符串当作了参数,应该是 2 1 3,怎么会这样呢?echo $args 显示 args 的值的确是 2 1 3。调试了半天发现这个 shell script 开头有个 IFS,不知道什么时候加上去的,上面的那句 IFS 导致以新行切分文件时将 “2 1 3″ 作为整体发给 java,而不是单独将 2 1 3 作为参数传给 java,所以去掉 IFS 语句就可以了。IFS 是个很有用的变量,默认下用来分割空格、制表、换行等,也可以用来分割指定字符,比如把 www:vpsee:com:8080 分割成 www vpsee com 8080 就可以用 IFS:

bash-3.00$ $line=www:vpsee:com:8080
bash-3.00$ $IFS=':'
bash-3.00$ $for i in $line; do  echo $i; done
www
vpsee
com
8080

上面 java 例子中的 `echo $1|sed ‘s/\.[^.]*$//’` 用来过滤掉后缀名,比如:编译 javac HelloWorld.java 需要 .java 后缀名,但是运行 java HelloWorld 就不需要带上 .class 后缀名。 下面的 shell script 得到一个文件名后打印出其不包含后缀名的文件名:

student=$1
student_title=`echo $1|sed 's/\.[^.]*$//'`
echo $student_title

修正 Django Step by Step 的一些例子

周末看了 limodouDjango Step by Step 入门教程,写得很棒,通俗易懂,谢谢先。Django 发展太快,现在已是 1.0.2 版本,可惜 Django Step by Step 上面的例子还是 0.9x 版本,所以编译运行上面的例子时会出现一些问题,主要是一些兼容问题,列出来以供参考:

第六讲

3、编辑 wiki/models.py


pagename = models.CharField(maxlength=20, unique=True)

在 Django 1.0.2 中,上面的 maxlength 应改为:

max_length

6、修改 wiki/views.py


c = Context({‘pagename’:page.pagename, ‘content’:content})

上面代码输出 content 时会把 “< >” 等字符转义输出成 “< &gt”,这个时候需要关闭自动转义,以便 content 输出 HTML 代码。改成如下:

c = Context({'pagename':page.pagename,'content':content},autoescape=False)

还有一种方法就是在 wiki/page.html 里改成:

{% autoescape off %}

{{ content }}

{% endautoescape %}

第七讲

3、修改 address/models.py


gender = models.CharField(‘性别’, choices=((‘M’, ‘男’), (‘F’, ‘女’)),
maxlength=1, radio_admin=True)

注意上面的 radio_admin=True 已经在 Django 1.0.2 中不适用了,不能写在 field 里,admin 和 model分离了,把 models.py 的全部内容用以下代码替换:

from django.db import models

# Create your models here.
class Address(models.Model):
        name = models.CharField('Name', max_length=6, unique=True)
        gender = models.CharField('Sex', choices=(('M', 'Male'), ('F', 'Female')), max_length=1)
        telphone = models.CharField('Telphone', max_length=20)
        mobile = models.CharField('Cellphone', max_length=11)
        room = models.CharField('Room', max_length=10)

from django.contrib import admin

class AddressAdmin(admin.ModelAdmin):
        model=Address
        radio_fields = {'gender':admin.VERTICAL}

admin.site.register(Address, AddressAdmin)

6、修改 urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns(”,

# Uncomment this for admin:
(r’^admin/’, include(‘django.contrib.admin.urls’)),
)

新的变化已经在 Django 1.0.2 生成的默认 url.py 里了,只需要把 urls.py 里面的 comment 前面的 # 去掉就可以了。

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

# Uncomment the next line to enable the admin:
     (r'^admin/(.*)', admin.site.root),

7、增加超级用户

manage.py shell
>>> from django.contrib.auth.create_superuser import createsuperuser
>>> createsuperuser()

只需要改成下面一条命令:

./manage.py createsuperuser

以上修正在 Django 1.0.2 + Python 2.5.1 + Mac OS X 10.5.7 上调试通过。