sql >> Databasteknik >  >> RDS >> Mysql

Infoga data från Perl till MysQL

Din användning av $db_config variabel ser misstänkt ut för mig. Antingen är din config-hash konstig, eller så använder du värden istället för nycklar.

Du har inte visat oss var $db_config är inställd, men jag skulle gissa att det ser ut ungefär så här:

$db_config = {
  name => 'Top_Data',
  host => '127.0.0.1',
  port => 3306,
  username => 'someone',
  password => 'a secret',
};

Och sedan skulle du använda det så här:

my $dsn = "DBI:mysql:database=".$db_config->{name}.";host=".$db_config->{host}.";port=".$db_config->{port};

Lägg märke till att jag har använt nyckelnamnen (name , host och port ) istället för värdena (Top_Data , 127.0.0.1 och 3306 ).

Jag ska också påpeka att du kan förenkla detta något genom att använda Perls förmåga att expandera variabler inuti en sträng med dubbla citattecken.

my $dsn = "DBI:mysql:database=$db_config->{name};host=$db_config->{host};port=$db_config->{port}";

Det finns ett annat problem senare, med din SQL-sats.

my $sql = 'insert into Top(Load_Average, CPU_us, CPU_id, CPU-wa, CPU_hi, 
           CPU_si, CPU_st, Swap_Total, Swap_Free, Swap_Used, Memory_Total, 
           Memeory_Free, Memory_Used, Memory_Buff, Date) 
           values(float,float,float,float,float,float,float,float,
           varchar,varchar,varchar,varchar,varchar,varchar,date)';

Värdena som du bör infoga är de faktiska dataposterna. Så där du har strängarna "flytande", "varchar" eller "datum", bör du faktiskt ha dataobjekt (ett flyttal, en sträng eller ett datum).

Slutligen, efter att ha förberett ditt uttalande, behöver du inte skicka det till execute() metod. Du bör dock titta på att använda bindningspunkter i din SQL och skicka dina faktiska dataobjekt till execute() ring




  1. Massuppdatering i postgreSQL med unnest

  2. PL/SQL otillräckliga privilegier inom en fråga manuellt möjligt

  3. Varför måste jag använda främmande nyckel om jag kan använda WHERE?

  4. SQL-UPPDATERING i en SELECT-rankning över partitionssats