cx_Oracle: Πώς μπορώ να επαναλάβει πάνω από ένα αποτέλεσμα που;

ψήφοι
35

Υπάρχουν διάφοροι τρόποι για να επαναλάβει πάνω από ένα σύνολο αποτελεσμάτων. Ποια είναι η ανταλλαγή μεταξύ του καθενός;

Δημοσιεύθηκε 03/08/2008 στις 02:15
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
35

Η κανονική τρόπος είναι να χρησιμοποιήσετε την ενσωματωμένη iterator δρομέα.

curs.execute('select * from people')
for row in curs:
    print row

Μπορείτε να χρησιμοποιήσετε fetchall()για να πάρετε όλες τις σειρές ταυτόχρονα.

for row in curs.fetchall():
    print row

Μπορεί να είναι βολικό να χρησιμοποιήσετε αυτό για να δημιουργήσετε μία λίστα Python που περιέχει τις τιμές επέστρεψε:

curs.execute('select first_name from people')
names = [row[0] for row in curs.fetchall()]

Αυτό μπορεί να είναι χρήσιμο για μικρότερα σύνολα αποτελεσμάτων, αλλά μπορεί να έχουν κακές παρενέργειες εάν το σύνολο των αποτελεσμάτων είναι μεγάλη.

  • Θα πρέπει να περιμένουμε για το σύνολο του αποτελέσματος που πρέπει να επιστραφεί με τη διαδικασία του πελάτη σας.

  • Μπορείτε να τρώνε πολλή μνήμη σε πελάτη σας να κρατήσει την οικιστική λίστα.

  • Μπορεί να πάρει λίγο χρόνο για Python για να κατασκευάσει και να αποδομήσει τη λίστα που θα έχετε την ευκαιρία να απορρίψει αμέσως ούτως ή άλλως.


Εάν γνωρίζετε ότι υπάρχει μια ενιαία γραμμή που επιστρέφονται στο αποτέλεσμα που μπορείτε να καλέσετε fetchone()για να πάρει την ενιαία γραμμή.

curs.execute('select max(x) from t')
maxValue = curs.fetchone()[0]

Τέλος, μπορείτε να βρόχο πάνω από το αποτέλεσμα που έχει την ανάκτηση μίας σειράς σε μια στιγμή. Σε γενικές γραμμές, δεν υπάρχει συγκεκριμένο πλεονέκτημα σε αυτόν τον τρόπο πάνω από τη χρήση του iterator.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()
Απαντήθηκε 03/08/2008 στις 02:17
πηγή χρήστη

ψήφοι
21

προτιμώμενος τρόπος μου είναι ο iterator δρομέα, αλλά και τον καθορισμό για πρώτη φορά το arraysize ιδιότητα του δρομέα.

curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
    print row

Σε αυτό το παράδειγμα, cx_Oracle θα φέρω σειρές από την Oracle 256 σειρές σε έναν χρόνο, μειώνοντας τον αριθμό των δρομολογίων του δικτύου που πρέπει να εκτελεστεί

Απαντήθηκε 24/09/2008 στις 03:51
πηγή χρήστη

ψήφοι
4

Υπάρχει, επίσης, ο τρόπος που psyco-pgφαίνεται να το κάνουμε ... Από ό, τι κατάλαβα, δεν φαίνεται να δημιουργεί λεξικό-όπως γραμμή-πληρεξούσια για τη χαρτογράφηση αναζήτησης κλειδί στο μπλοκ μνήμης που επιστρέφονται από το ερώτημα. Σε αυτή την περίπτωση, γοητευτικός ολόκληρη την απάντηση και λειτουργεί με παρόμοιο μεσολάβησης του εργοστασίου πάνω από τις γραμμές μοιάζει χρήσιμη ιδέα. Ελάτε να σκεφτείτε από το αν, αισθάνεται περισσότερο σαν Λούα από την Python.

Επίσης, αυτό θα πρέπει να ισχύει για όλες τις DBAPI2.0 PEP-249 διεπαφές, όχι μόνο Oracle, ή μήπως εννοείτε ακριβώς ταχύτερα με τη χρήση της Oracle ;

Απαντήθηκε 24/08/2008 στις 18:28
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more