1

背景:具有 bash shell 脚本知识的非开发人员需要查询只读数据库实例并为给定变量生成数据。

现有文件中的数据

A1 B1
A2 B2
......
...
....
An Bn

我想在 bash 脚本中连接到 mysql 数据库并循环选择语句“n”次

select x, y,z from table tablet_vendors where a=A1 and b=B1

除了 A1 和 B1 第一次需要作为参数传递,A2 和 B2 需要在下一次作为参数传递,然后在 for 循环中传递给 n。我知道事物的外壳方面,但不知道如何整合两者。

尝试了一些可以在 shell 脚本开头定义“a”所有可能值的方法,但这太乏味了。任何帮助表示赞赏。

如果其他脚本语言易于使用 mysql 并且您可以提供一些指导,我愿意接受有关使用其他脚本语言的建议。我的搜索指向 php 和 python??

4

2 回答 2

0
#!/usr/bin/python
# -*- coding: utf-8 -*-
import _mysql, sys

argumentfile = sys.argv[1]

with open(argumentfile) as f:
    sqlarguments = f.readlines()

con = None
username, password = 'testuser', 'testpass'
database = 'testdb'

try:
    con = _mysql.connect('localhost', username, password, database)

    for line in sqlarguments:
        con.query("SELECT x, y,z FROM TABLE tablet_vendors WHERE a='%s' and b='%s;'" % line.split('\t'))

        result = con.use_result()
        print "MySQL data returned: %s" % \
            result.fetch_row()[0]
except _mysql.Error, e:
    print "Error %d: %s" % (e.args[0], e.args[1])
    sys.exit(1)

finally:
    if con:
        con.close()

有关 Python 和 MySQL 的更多信息:http: //zetcode.com/db/mysqlpython/ (如果您已经安装了 MySQL 和所有设置,请跳至“第一个示例”)

请注意,它的检索sqlarguments取自文本文件,该文本文件作为参数传递给脚本,作为第一个也是唯一的参数,例如:python2 script.py sqlfile.txt. 另请注意,我假设 SQL 参数由 \t (制表符)而不是空格分隔,然后我将其作为空格传递a='...'b='...'封装在'空格中。

于 2013-02-07T07:50:22.310 回答
0

这是一个更简单的版本:

import MySQLdb as mysql
import csv

con = mysql.connect('localhost','user','password','dbname')
cur = con.cursor()

q = "select x, y,z from tablet_vendors where a=%s and b=%s"

with open('somefile.txt') as f:
  rows = csv.reader(f,delimiter='\t')
  for row in rows:
     cur.execute(q,row)
     result = cur.fetchone()
     while result:
        print result
        result = cur.fetchone()

MySQL 抛出的任何错误都将停止执行。您可以将这些cur.行包装在 try/except 块中以更优雅。

于 2013-02-07T08:34:40.767 回答