Σελιδοποίηση με κλειδί και σταθερή ταξινόμηση — DedSec Project
Σελιδοποίηση με κλειδί και σταθερή ταξινόμηση Μηχανισμός και συμβόλαιο Η σελιδοποίηση με offset ζητά από τη βάση να παραλείψει συγκεκριμένο πλήθος γραμμών. Ταυτόχρονες εισαγωγές πριν από το…
Μηχανισμός και συμβόλαιο
Η σελιδοποίηση με offset ζητά από τη βάση να παραλείψει συγκεκριμένο πλήθος γραμμών. Ταυτόχρονες εισαγωγές πριν από το όριο μπορούν να προκαλέσουν διπλές ή χαμένες εμφανίσεις. Η σελιδοποίηση με κλειδί ζητά γραμμές μετά το τελευταίο κλειδί ταξινόμησης. Απαιτεί πλήρη σειρά: μια χρονική σήμανση δεν αρκεί όταν επαναλαμβάνεται. Πρόσθεσε μοναδικό ID ως κριτήριο ισοπαλίας.
Ο cursor είναι συμβόλαιο συνέχισης και όχι μυστικό εξουσιοδότησης. Σύνδεσέ τον με ερώτημα, κατεύθυνση και πελάτη, και πιστοποίησέ τον όταν η αλλοίωση επηρεάζει επιτρεπόμενη συμπεριφορά. Οι έλεγχοι πρόσβασης χρειάζονται σε κάθε σελίδα. Το κλειδί μειώνει μετακινήσεις ορίου αλλά δεν δημιουργεί ιστορικό στιγμιότυπο όταν γραμμές αλλάζουν ή αφαιρούνται κατά τη διάσχιση.
Τοπικό παράδειγμα
import sqlite3
from contextlib import closing
with closing(sqlite3.connect(":memory:")) as db:
db.execute("CREATE TABLE events(ts INTEGER, id INTEGER PRIMARY KEY)")
db.executemany("INSERT INTO events VALUES (?, ?)", [(10,1),(10,2),(11,3)])
page = db.execute("SELECT ts,id FROM events ORDER BY ts,id LIMIT 2").fetchall()
cursor = page[-1]
next_page = db.execute(
"SELECT ts,id FROM events WHERE (ts,id) > (?,?) ORDER BY ts,id LIMIT 2",
cursor).fetchall()
assert page == [(10,1),(10,2)] and next_page == [(11,3)]
print("tie boundary handled")
Έλεγχοι αποτυχίας και όρια
Δοκίμασε ίδιες χρονικές τιμές, κενή σελίδα, αντίστροφη σειρά και διαγραφή γραμμής cursor. Αποθήκευσε τις τιμές ταξινόμησης χωρίς απαίτηση ύπαρξης της γραμμής. Διευκρίνισε αν το API διασχίζει ζωντανά δεδομένα ή στιγμιότυπο. Σύγκρινε σχέδια ερωτημάτων σε ρεαλιστικά δεδομένα πριν υποσχεθείς απόδοση μόνο λόγω χρήσης cursor.