मैं एक Linux सर्वर से MS SQL Server 2008 (कनेक्शन स्ट्रिंग) से कनेक्ट करने के लिए ODBC और FreeTDS का उपयोग कर रहा हूं। मुझे SQL सर्वर पर तालिका में RHEL- सर्वर पर एक स्थानीय .CSV फ़ाइल की सामग्री प्राप्त करने की आवश्यकता है। हालाँकि मेरी SQL कम से कम कहने के लिए थोड़ा जर्जर है। मुझे कैसे आगे बढ़ना चाहिए? मैं डीबीआई का भी अजनबी हूं।
#!/usr/bin/perl
# PERL MODULES WE WILL BE USING
use DBI;
use DBD::ODBC;
my $data_source = q/dbi:ODBC:MSSQLServer/; # DSN string from /etc/odbc.ini
my $user = q/Username/;
my $password = q/Password/;
my $dbh = DBI->connect($data_source, $user, $password, {RaiseError => 0, PrintError => 1}) or die "Can't connect to $data_source: $DBI::errstr";
.Csv फ़ाइल में प्रत्येक पंक्ति पर अल्पविराम द्वारा अलग किए गए 2 मान हैं। हर पंक्ति को तालिका में सम्मिलित किया जाना चाहिए। डेटाबेस की तालिका में 2 कॉलम (attribute1
और attribute2
) हैं।
.csv सामग्री उदाहरण:
server1, id1
server2, id2
server3, id1
server4, id9
प्राथमिक कुंजी संख्या मान पहले से सेट है, इसलिए मुझे नहीं लगता कि डुप्लिकेट मान एक समस्या है।
3 जवाब
माफ करना मुझे एहसास नहीं हो रहा था कि मैंने थोड़ा बहुत पूछा। मैं वास्तव में इसे अपने दम पर समझ गया। इसलिए मुझे लगता है कि अगर किसी को इसकी जरूरत है तो मैं यहां कोड छोड़ दूंगा। आपका दिन शुभ हो!
#!/usr/bin/perl
# PERL MODULES
use strict;
use DBI;
use DBD::ODBC;
use Text::CSV;
use List::MoreUtils qw(each_array);
# SOME VARIABLES
my $file = '/tmp/Stevo/clientlist.csv';
my $csv = ();
my $fh = ();
my $data_source = q/dbi:ODBC:MSSQLServer/;
my $user = q/username/;
my $password = q/password/;
# WRITE HOSTNAMES FROM CSV TO ARRAY
my @hostnames;
open (my $csv, '<', $file) || die "cant open";
foreach (<$csv>) {
chomp;
my @fields = split(/\,/);
push @hostnames, $fields[0];
}
# WRITE CLIENTVERSIONS FROM CVS ARRAY
my @clientversions;
open (my $csv, '<', $file) || die "cant open";
foreach (<$csv>) {
chomp;
my @fields = split(/\,/);
push @clientversions, $fields[1];
}
# CONNECTION STRING
my $dbh = DBI->connect($data_source, $user, $password, {RaiseError => 0, PrintError => 1}) or die "Can't connect to $data_source: $DBI::errstr";
# INSERTION CODE
my $sth_insert = $dbh->prepare('INSERT INTO dbo.LegatoClients (ClientName, ClientVersion) VALUES (?, ?)')
or die $dbh->errstr;
# EVERYTIME $EA IS CALLED THE NEXT LINE OF THE ARRAYS WILL BE RETURNED
my $ea = each_array(@hostnames, @clientversions);
# SET VALUES USING THE EVERYTIME ARRAY
while ( my ($val_hostnames, $val_clientversions) = $ea->() ) {
$sth_insert->execute($val_hostnames, $val_clientversions) or die $dbh->errstr;
}
आपके परीक्षण में शामिल हैं:
Server1, id1
Server2, id2
Server3, id1
Server4, id9
==============================
बल्क डालने के लिए नीचे दिए गए कोड का उपयोग करें।
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
open(my $file, '<' , "test.csv");
my @all_data;
while(my $data = <$file>){
chomp($data);
if($data){
$data =~ s/^\s+//;
$data =~ s/\s+$//;
my $string = qq{($data)};
push(@all_data,$string)
}
}
close $file;
my $sql_string = join(',',@all_data);
my $dbname = "DBName";
my $dsn = "dbi:SQLite:dbname=$dbname";
my $username = "user";
my $password = "pass";
my $dbh = DBI->connect($dsn, $username , $password, {
PrintError => 0,
RaiseError => 1,
AutoCommit => 1,
FetchHashKeyName => 'NAME_lc',
});
my $sql = qq{INSERT INTO ServerDetails (server, id) VALUES $sql_string};
$dbh->do($sql);
$dbh->disconnect;
सिंगल इंसर्ट के लिए नीचे दिए गए कोड का उपयोग करें:
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
my $dbname = "DBName";
my $dsn = "dbi:SQLite:dbname=$dbname";
my $username = "user";
my $password = "pass";
my $dbh = DBI->connect($dsn, $username, $password, {
PrintError => 0,
RaiseError => 1,
AutoCommit => 1,
FetchHashKeyName => 'NAME_lc',
});
open(my $file, '<' , "test.csv");
while(my $data = <$file>){
chomp($data);
if($data){
$data =~ s/^\s+//;
$data =~ s/\s+$//;
my $sql = qq{INSERT INTO ServerDetails (server, id) VALUES ($data)};
$dbh->do($sql);
}
}
close $file;
$dbh->disconnect;
अपने कोड में इस बिंदु पर आप केवल अपने डेटाबेस से जुड़े हैं। कृपया यहां एक उदाहरण देखें स्टैकओवरफ्लो में जो आपको यह देखने में मदद कर सकता है कि आपके अगले चरण क्या हो सकते हैं (यह MySQL को संदर्भित करता है लेकिन यह अभी भी शिक्षाप्रद है):
MySQL DB में पर्ल डालने का कार्य
इसके अलावा, मैं सुझाव दूंगा कि उपयोगकर्ता मैट जैकब ने अपनी टिप्पणियों में और टिम बेंस और एलीगेटर डेसकार्टेस द्वारा "द प्रोग्रामिंग विद द पर्ल डीबीएल: डाटाबेस प्रोग्रामिंग विद पर्ल" का उल्लेख किया है।
HTH
संबंधित सवाल
नए सवाल
sql
संरचित क्वेरी भाषा (एसक्यूएल) डेटाबेस को क्वेरी करने के लिए एक भाषा है। प्रश्नों में कोड उदाहरण, तालिका संरचना, नमूना डेटा और DBMS कार्यान्वयन के लिए एक टैग (जैसे MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, आदि) का उपयोग किया जाना चाहिए। यदि आपका प्रश्न केवल एक विशिष्ट DBMS (विशिष्ट एक्सटेंशन / सुविधाओं का उपयोग करता है) से संबंधित है, तो इसके बजाय उस DBMS के टैग का उपयोग करें। एसक्यूएल के साथ टैग किए गए सवालों के जवाब में आईएसओ / आईईसी मानक एसक्यूएल का उपयोग करना चाहिए।