Сценарий для получения данных из файла csv и выполнения связанных операций с базой данных

Я не могу добавлять комментарии в своей учетной записи, но я просто пытаюсь узнать больше, чтобы помочь в устранении неполадок.

Похоже, у вас три компьютера, один локальный и два удаленных. И у каждого из них есть две учетные записи, с которыми вы работаете?

Если у вас есть личная и служебная учетная запись на локальном компьютере, и вы запускаете ssh service @ remote-2 из личной учетной записи на своем локальном компьютере машина, то он найдет ssh-ключи только для вашей локальной личной учетной записи, но не для служебной учетной записи. Это не имеет значения, если вы добавили локально-личный открытый ключ в файл авторизованных ключей учетной записи удаленной службы.

Мне показалось любопытным, что в последних нескольких строках после «Следующий метод аутентификации: publickey» ссылки на пути к файлам относятся к «/ home / myuserid», а не «/ home / serviceaccountid». Это похоже на большую подсказку.

Это ssh ищет ключи в локальной учетной записи ... Это должен быть домашний каталог любой учетной записи, из которой вы вызываете ssh. Если вы ожидаете, что этот путь будет домом учетной записи службы, вам необходимо войти в учетную запись службы и , затем запустить ssh.

1
14.07.2016, 08:35
2 ответа

Вы можете использовать этот скрипт:

#!/bin/bash
PREFIX="A2B1 "
TABLE="sqltablename"
COLUMN="sqlcolumnname"
if [[ ! -r "$1" ]]; then
   echo "unable to read file '$1'"
   exit 1
fi

cut -d, -f2 "$1" | while read phonenum; do
   newnum="$PREFIX $phonenum"
   echo "UPDATE $TABLE SET $COLUMN = '$newnum' WHERE $COLUMN = '$phonenum';"
done

Он, если вы запустите его с вашим CSV файлом в качестве параметра (например, ./script.sh /path/to/mydata.csv), выведет серию SQL операторов, которые обновят данные, как вы описали. Измените сценарий, чтобы использовать правильное имя таблицы и столбца.

После того, как вы убедитесь, что он выдает нужные вам утверждения, вы можете направить его в ваш SQL-движок или сохранить вывод в SQL-файл, который вы можете выполнить, как вам удобно, с помощью ./script.sh /path/to/mydata.csv > /path/to/updatephonenumbers.sql.

0
27.01.2020, 23:47

Пока вы можете do mysql запросы / обновления / и т. д. в сценарии оболочки гораздо проще использовать язык (например, perl или python ) с хорошей поддержкой обеих баз данных. и файлы CSV.

Вот один из способов сделать это в perl , используя модуль perl DBI и модули DBD :: CSV и DBD :: mysql .

Он читает каждую строку из вашего CSV-файла (я назвал это «обновлениями».csv 'и предположил, что имя столбца - phonenum ), и выдает команды SQL UPDATE для пользователей таблицы базы данных dbname в mysql. Измените dbname в соответствии с вашей базой данных.

ПРИМЕЧАНИЕ: следующий код не тестировался, но должен работать. Поскольку это не проверено, возможно, я допустил несколько опечаток или других ошибок.

Я настоятельно рекомендую сначала протестировать его на КОПИИ вашей базы данных, а не сразу запускать его на реальных данных. Фактически, ВСЕГДА - хорошая идея протестировать свой код на копии реальных данных, независимо от того, что вы пишете или на каком языке пишете.

#! /usr/bin/perl

use strict;
use DBI;

### 
### variables setup
### 

# DBD::CSV treats all .csv files in this dir as tables.
# i.e. this directory is the "database" and the .csv files
# are the tables in that database.
my $csv_dir = '/path/to/csv/dir'; 

my $csv_db  = 'updates';    # corresponds to "$csv_dir/updates.csv"

my $m_db    = 'dbname';     # replace with your mysql database name 
my $m_user  = 'username';
my $m_pass  = 'password';
my $m_host  = 'localhost';
my $m_port  = '3306';
my $m_dsn   = "DBI:mysql:database=${m_db};host=${m_host};port=${m_port}";

###
### database handle setup
###

# database handle for CSV connection
my $c_h = DBI->connect ("DBI:CSV:", undef, undef, {
               f_ext      => ".csv/r",
               f_dir => $csv_dir,
               RaiseError => 1,
               }) or die "Cannot connect: $DBI::errstr";


# database handle for mysql connection
my $m_h = DBI->connect($m_dsn, $m_user, $m_pass, { PrintError => 0 });

###
### all set up, time to do some work.
###

# NOTE: this script assumes that the .csv file contains a header line with
# the field names as the first line of the file.
#
# If not, the easiest thing to do is edit it with your preferred text
# editor and add one.  Otherwise, see `man DBD::CSV` to find out how to
# specify field names.
#
# or EDIT and uncomment the following three lines of code:

#$c_h->{csv_tables}{$csv_db} = { 
#  col_names => [ qw(column1 phonenum column3 column4 ...) ];
#};

# prepare statement handle for csv db query using a placeholder ? for the
# column name.
my $c_sth = $c_h->prepare("select phonenum from ?");

# and execute it.  later, we'll use a forech loop to read the data returned
$c_sth->execute($csv_db);

# prepare the SQL statement for the mysql db using placeholders ? for
# the values. this assumes that the column/field name is also called
# 'phonenum' in mysql.  These placeholders are invaluable, they automaticaly
# quote any data that needs to be quoted (e.g. strings) while not quoting
# things that shouldn't be quoted (e.g. integers).  They prevent a huge
# range of common mistakes.
#
# prepare it once, execute it multiple times with different values.

my $m_sth = $m_h->prepare('UPDATE users SET phonenum = ? WHERE phonenum = ?');

$m_h->begin_work;  # begin transaction

foreach ($c_sth->fetchrow_array) {
   chomp;
   my $newphone = "A2B1 $_";
   $m_sth = $m_sth->execute($newphone, $_);
};

$m_h->commit;  # commit transaction

### 
### we're done.  finish the statement handles and disconnect from
### the databases.
###
$c_sth->finish;
$m_sth->finish;
$c_h->disconnect;
$m_h->disconnect;

Это выглядит длиннее, чем средний сценарий быстрой оболочки, но большая часть кода - это просто настройка переменных и дескрипторов базы данных (и этот код настройки можно повторно использовать в других аналогичных сценариях). Фактический код, выполняющий эту работу, (без комментариев) состоит всего из примерно полдюжины строк.

1
27.01.2020, 23:47

Теги

Похожие вопросы