我有一个文件“sharp.csv”,其中的数据是这样的:
<name>;<src_ip_address>;<mac_address>;<ip_address>;Vlan1;NOW()
编辑:这些数据由perl脚本填充 我想借助BASH脚本将这些数据插入到SQL数据库中
+---------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| code_site | varchar(64) | NO | PRI | NULL | |
| ip_source | varchar(64) | NO | PRI | NULL | |
| mac_relevee | varchar(64) | NO | PRI | NULL | |
| ip_relevee | varchar(64) | YES | | NULL | |
| vlan_concerne | varchar(64) | YES | | NULL | |
| date_polling | datetime | YES | | NULL | |
+---------------+-------------+------+-----+---------+-------+
所以我的命令只是:
arp_router_file="$DIR/working-dir/sharp.csv"
db_arp_router_table="routeur_arp"
$mysql -h $db_address -u $db_user -p$db_passwd $db_name -e "load data local infile '$arp_router_file' REPLACE INTO TABLE $db_arp_router_table fields terminated by ';';"
但我的 NOW()命令不起作用。 数据被插入,但“date_polling”行填充了“0000-00-00 00:00:00”
答案 0 :(得分:1)
NOW()
是一个函数,但load data
命令会将输入文件中的所有字段视为文字数据,从而尝试在"NOW()"
字段中插入datetime
。字符串"NOW()"
无法转换为有效的日期时间值,因此您最终会使用默认的&#34; 0000-00-00 00:00:00&#34;值。
您必须从输入文件构建实际的SQL INSERT
查询,您可以使用awk
执行此操作:
cat input_file.csv | awk -F';' '{print "INSERT INTO routeur_arp (code_site, ip_source, mac_relevee, ip_relevee, vlan_concerne, date_polling) VALUES (\"" $1 "\", \"" $2 "\", \"" $3 "\", \"" $4 "\", \"" $5 "\", " $6 ");"}' > sql_statements.sql
答案 1 :(得分:0)
为了避免向MySQL发送NOW()指令,我将发送一个带有perl的日期时间
use Time::Piece ;
my $t = localtime ;
my $date = $t->ymd;
my $time = $t->hms;
而不是
<name>;<src_ip_address>;<mac_address>;<ip_address>;Vlan1;NOW()
它将
<name>;<src_ip_address>;<mac_address>;<ip_address>;Vlan1;$date $time\n
Perl将其作为String发送,MySQL理解为正确的Datetime