2010-02-17 18 views
13

मैं SQLite3 डेटाबेस से पूछताछ करने के लिए डीबीआई का उपयोग कर रहा हूं। मेरे पास क्या काम करता है, लेकिन यह कॉलम को क्रम में वापस नहीं करता है। उदाहरण:पर्ल में डीबीआई के साथ कॉलम नाम और पंक्ति डेटा कैसे प्राप्त कर सकता हूं?

Query: select col1, col2, col3, col4 from some_view; 
Output: 

    col3, col2, col1, col4 
    3, 2, 1, 4 
    3, 2, 1, 4 
    3, 2, 1, 4 
    3, 2, 1, 4 
    ... 

(values and columns are just for illustration) 

मुझे पता है क्योंकि मैं एक हैश उपयोग कर रहा हूँ यह हो रहा है, लेकिन और कैसे मैं स्तंभ नाम वापस मिलता है अगर मैं केवल एक सरणी का उपयोग करें? (मैं जरूरत उत्पादन सही क्रम में और स्तंभ नाम के साथ है, यही कारण है।)

col1, col2, col3, col4 
    1, 2, 3, 4 
    1, 2, 3, 4 
    1, 2, 3, 4 
    1, 2, 3, 4 
    ... 

मैं: सभी मैं क्या करना चाहते हैं किसी भी मनमाना क्वेरी के लिए कुछ इस तरह मिलता है मैं बहुत अधिक पर्ल नौसिखिया हूं, लेकिन मैंने वास्तव में सोचा कि यह एक साधारण समस्या होगी। (मैंने रूबी और PHP में पहले यह किया है, लेकिन मुझे पर्ल दस्तावेज़ में जो कुछ भी दिख रहा है उसे ट्रैक करने में मुझे परेशानी हो रही है।)

यहां इस समय मेरे पास क्या है:

use Data::Dumper; 
use DBI; 

my $database_path = '~/path/to/db.sqlite3'; 

$database = DBI->connect(
    "dbi:SQLite:dbname=$database_path", 
    "", 
    "", 
    { 
    RaiseError => 1, 
    AutoCommit => 0, 
    } 
) or die "Couldn't connect to database: " . DBI->errstr; 

my $result = $database->prepare('select col1, col2, col3, col4 from some_view;') 
    or die "Couldn't prepare query: " . $database->errstr; 

$result->execute 
    or die "Couldn't execute query: " . $result->errstr; 

########################################################################################### 
# What goes here to print the fields that I requested in the query? 
# It can be totally arbitrary or '*' -- "col1, col2, col3, col4" is just for illustration. 
# I would expect it to be called something like $result->fields 
########################################################################################### 

while (my $row = $result->fetchrow_hashref) { 
    my $csv = join(',', values %$row); 
    print "$csv\n"; 
} 

$result->finish; 

$database->disconnect; 
+0

क्षमा करें, यकीन नहीं क्यों यह उतर गया मतदान किया। अगर आपको लगता है कि इसे बेहतर किया जा सकता है तो कृपया एक टिप्पणी छोड़ दें। –

उत्तर

15

"यहाँ क्या हो जाता है" टिप्पणी और साथ निम्नलिखित पाश बदलें। तुम भी जो कुछ भी मामले डेटाबेस उन में लौटने का फैसला करता है के लिए अपरकेस के लिए NAME_uc, या NAME उपयोग कर सकते हैं।

तुम भी शायद बजाय अपनी खुद की CSV फ़ाइल रोल करने की कोशिश कर के Text::CSV या Text::CSV_XS का उपयोग कर होना चाहिए, लेकिन है कि एक और सवाल है।

+0

ग्रेट, मैं कोशिश करूँगा। मैं टेक्स्ट :: सीएसवी का उपयोग करूंगा, लेकिन मैं फिलहाल परीक्षण उद्देश्यों के लिए आउटपुट प्रिंट कर रहा हूं। –

+0

महान काम किया। एक बार फिर धन्यवाद। कोई आश्चर्य नहीं कि जब मैंने खोज की तो यह नहीं आया - Google '@ {$ result -> {NAME}} जैसी चीज़ों पर चोक करता है। –

+1

ठीक है, खोज करने की जगह http://search.cpan.org/perldoc?DBI (या आपकी स्थानीय प्रतिलिपि) है। – cjm

1

आप परिणाम हैश के रूप में पूछ रहे हैं। एक हैश स्वाभाविक रूप से अनियंत्रित है। शायद आप fetchrow_arrayref चाहते हैं।

वास्तव में, यदि आपने keys %$row पर देखा था, तो आप इसी कुंजी को भी ऑर्डर से बाहर देख सकते थे। यह हैश की प्रकृति है ... प्रत्येक कुंजी को उसके मूल्य के साथ जोड़ दिया जाता है, लेकिन चाबियों या मानों का समग्र क्रम बाहरी उपयोग नहीं, एक्सेस के लिए अनुकूलित किया जाता है।

my $fields = join(',', @{ $result->{NAME_lc} }); 
print "$fields\n"; 

while (my $row = $result->fetchrow_arrayref) { 
    my $csv = join(',', @$row); 
    print "$csv\n"; 
} 

NAME_lc छोटे अक्षरों में फ़ील्ड नाम देता है:

+0

प्रश्न से: "मुझे पता है कि यह हो रहा है क्योंकि मैं एक हैश का उपयोग कर रहा हूं, लेकिन अगर मैं केवल सरणी का उपयोग करता हूं तो कॉलम नाम वापस कैसे प्राप्त करूं?" यह आखिरी हिस्सा है जिसमें मुझे कोई समस्या है। –

+1

डीबीआई दस्तावेज़ पर "स्टेटमेंट हैंडल एट्रिब्यूट्स" देखें। –

+0

जो मैंने पर्ल में पढ़ा है, वही हैश पर कार्यरत 'चाबियाँ' और 'मान' फ़ंक्शंस से संबंधित एरे में तत्वों के समान क्रम देने की गारंटी दी जाती है। तो एक चाल पहली पंक्ति लाने के लिए होगी, फ़ील्ड नामों को पकड़ो, फिर बाकी पंक्तियों को संसाधित करना जारी रखें। – jerseyboy

2

आप संरक्षित करने के लिए, लेकिन अभी भी नाम उपयोग के द्वारा क्षेत्रों का उल्लेख करने के लिए एक हैश का उपयोग करना चाहते हैं:

$dbh->selectall_arrayref($sql,{ Slice => {} }); 

यह आपको हैश के एक आदेश दिया सरणी दे देंगे

2

में अपने स्तंभ नाम को परिभाषित करें आपके चयन

आदर्श रूप से आपके पास डीबीआई के साथ का चयन करने वाले कॉलम की एक सूची होगी, और आप उस सरणी का उपयोग करेंगे।

आप हैश से ही स्तंभ नाम प्राप्त करने की आवश्यकता है, तो यह काम करेंगे, और आप इसे सॉर्ट कर सकते हैं, लेकिन वहाँ मूल एसक्यूएल का चयन करें आदेश का कोई संकेत नहीं (हैश में) है:

my %cols_hash = ("name" => "john", "age" => 2, "color" => "apalachian"); 
my $cols_hash_ref = \%cols; 

my @keys = (sort keys %$cols_hash_ref); 
my @vals; 
foreach (@keys){ push @vals, $$cols_hash_ref{$_} }; 

उम्मीद है कि इससे मदद मिलती है।

जब मैं खोज मैं एक तरह से DBI से स्तंभ नाम पाने के लिए मिला:

$sth = $dbh->prepare($query) or die "Prepare exceptioin: $DBI::errstr!"; 
$rv = $sth->execute() or die "Execute exception: $DBI::errstr"; 
$res = $sth->fetchall_arrayref(); 

# Array reference with cols captions, which were retrived. 
$col_names_array_ref = $sth->{NAME};   

है कि आप मूल क्रम में स्तंभ नाम देना चाहिए, लेकिन मैं इसे परीक्षण नहीं किया।

1

यहाँ मैं क्या करना है:

use Data::Dump qw(dump); 
    # get column names in array 
    my @column_names_array= $sth->{NAME}; 
    # print out column names in pretty format 
    print "Field names: \n"; 
    dump(@column_names_array); 
+0

अच्छा .. यह एक साधारण चित्रण है। धन्यवाद! –

संबंधित मुद्दे

 संबंधित मुद्दे