Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

Redis OM สำหรับ Python: Object Mapping & Fluent Queries ที่ราบรื่น

Object Mapping และ Fluent Queries ที่เข้าใจง่ายสำหรับ Redis และ Python

ฉันตื่นเต้นที่จะแนะนำ Redis OM สำหรับ Python library ใหม่ที่เน้นนักพัฒนาสำหรับ Redis ที่ให้คุณฟีเจอร์อย่าง object mapping, data validation และอื่นๆ

Preview release นี้ของ Redis OM สำหรับ Python ให้คุณสร้างโมเดลข้อมูลด้วย declarative models ที่จะรู้สึก like home สำหรับผู้ใช้ object-relational mappers (ORMs) เช่น SQLAlchemy, Peewee, และ Django ORM

แต่มันไม่ได้แค่นั้น! ทุก Redis OM model ก็เป็น Pydantic model ด้วย ดังนั้นคุณสามารถใช้ Pydantic validation ที่ทรงพลังและขยายได้ นอกจากนี้ Redis OM models จะทำงานได้ทุกที่ที่ Python library คาดหวัง Pydantic models ดังนั้นคุณสามารถใช้ Redis OM model กับ FastAPI เพื่อ validate และสร้าง API documentation สำหรับ API endpoints อัตโนมัติ

ฟีเจอร์อีกอย่างที่ฉันชอบคือ Redis OM รองรับ fluent query expressions และ secondary indexes Redis OM สำหรับ Python ยังรองรับทั้ง asynchronous (asyncio) และ synchronous programming ใน library เดียวกัน และรายการฟีเจอร์เก๋ๆ ยังยาวนาน!

อ่านต่อเพื่อเรียนรู้วิธีที่ฉันสร้าง library นี้ และรายละเอียดเบื้องหลังของฟีเจอร์สำคัญบางอย่าง หรือถ้าคุณพร้อมเล่นโค้ด ดู getting started tutorial

Declarative models สำหรับ Redis

นักพัฒนาถึง Redis ผ่าน client library เพื่อสร้าง Redis data structures (เช่น Hashes) และ commands ต่อพวกเขา

หลายคนเพลินใจกับ command-based interface เพราะมันง่ายกว่าเขียน SQL queries กับ relational database แต่เมื่อไหร่ก่อนที่คุณเขียน SQL? นักพัฒนาใช้ modern web frameworks มักใช้ ORMs แทน โดยเฉพาะ declarative models

สิ่งที่ฉันชอบใน ORMs คือพวกมันลดความซับซ้อนที่ไม่เกี่ยวข้องกับปัญหาที่คุณพยายามแก้ เราสร้าง Redis OM ให้คุณสุดท้ายได้ประสบการณ์เดียวกันกับ Redis

Hashes หรือ JSON ตัวเลือกของคุณ

Redis OM สำหรับ Python มี 2 base model classes ที่คุณใช้สร้าง models: HashModel และ JsonModel.

ผู้ใช้ Redis open-source สามารถใช้ HashModel จัดเก็บข้อมูลใน Redis เป็น Hashes ในขณะที่ผู้ใช้ที่มีโมดูล RedisJSON ติดตั้ง หรือใช้ Redis Enterprise Cloud หรือ Software สามารถใช้ JsonModel จัดเก็บข้อมูลเป็น JSON objects แบบ native ฉันจะพูดเพิ่มเกี่ยวกับความแตกต่างระหว่างคลาสเหล่านี้ภายหลัง แต่ตอนนี้เราจะใช้ HashModel.

การกำหนดโมเดลแบบกระชับ

ดูตัวอย่างโค้ด Redis OM นี้ที่ define Customer model และใช้จัดเก็บข้อมูลใน Redis:

การกำหนดโมเดลกระชับนี้ทันทีให้คุณเมธอดอย่าง `get()` และ `save()` เบื้องหลัง เมธอดเหล่านี้จัดการข้อมูลใน Redis Hashes

Redis OM ทำมากกว่านั้น มันยัง generate globally unique และ sortable primary keys ส่วนนี้ super useful มาอธิบายวิธีการทำงาน

Primary keys ที่ globally unique

Redis OM สร้าง globally unique primary key ให้ทุก model instance อัตโนมัติ คุณใช้ primary key นี้จัดเก็บและดึงข้อมูลโมเดลใน Redis

Primary keys เหล่านี้รับประกัน globally unique แต่ยังสร้างขึ้นทั้งหมดใน client โดยไม่มี request ไป Redis มันยัง sortable และ compact ทั้งหมดนี้เป็นไปได้เพราะ specification ของ Universally Unique Lexicographically Sortable Identifiers (ULID)

Redis OM สำหรับ Python: Object Mapping & Fluent Queries ที่ราบรื่น

Redis OM primary keys เป็น ULIDs โดย python-ulid คุณอ่านเพิ่มเติมเกี่ยว ULID specification ได้ที่นี่ มันเก๋มาก!

นอกจาก persistence features แล้ว คุณยังได้ data validation ด้วย Pydantic มาขุดลึกว่าการ validate ทำงานอย่างไร

Data validation ด้วย Pydantic

ความแตกต่างระหว่าง Redis และ relational databases คือ Redis ไม่บังคับ schema ดังนั้นคุณเขียน string ใน Redis แล้ว overwrite ด้วย number ได้ทีหลัง นี่ยืดหยุ่นกว่า relational databases แต่หมายความว่าแอปพลิเคชันต้องรับผิดชอบ validation เอง

เราคิดว่าคุณไม่ควรต้องหาวิธีที่ดีที่สุดจัดการ validation ในแอปพลิเคชันของคุณ เอง ดังนั้น ทุก Redis OM model จึงเป็น Pydantic model ด้วย หมายความว่าคุณได้ Pydantic validation ตาม type hints ในโมเดลของคุณ และคุณควบคุม validation ผ่าน standard Pydantic hooks รวมถึง custom validators

นี่คือตัวอย่างโค้ดแสดงวิธีการ validate:

ถ้า Redis OM สำหรับ Python ให้แค่ persistence methods และ data validation ฉันคิดว่ามันเก๋แล้ว แตเราอยากจัดการความซับซ้อนมากกว่านี้ และเพื่อทำนั้น เราต้องช่วยคุณเขียน expressive queries เหมือนกับ ORM ต่อไปฉันจะพูดถึงวิธีที่ queries นี้ทำงาน

Fluent query expressions

ORMs ไม่ได้แค่ให้ declarative models พวกมันยังให้ API ที่ให้คุณ query ข้อมูลจาก attributes อื่นๆ นอกจาก primary key จินตนาการหา customers ทั้งหมดที่อายุมากกว่าจำนวนหนึ่ง customers ที่สมัครก่อนวันที่หนึ่ง ฯลฯ

Out of the box Redis เก่งมากในการ lookup ด้วย primary key มันเป็น key-value store ที่ values เป็น data structures แต่ Redis ไม่รวม querying และ secondary indexing system ดังนั้นถ้าคุณอยาก index และ query ข้อมูล คุณต้องจัดการ indexes เองด้วยวิธีซับซ้อน

ตรงนี้อีกครั้ง เราอยากจัดการความซับซ้อนนี้ให้คุณ ดังนั้นเราสร้าง fluent query expressions บนโมดูล Redis ที่จำเป็น: RediSearch RediSearch เป็น source-available module ที่ให้คุณ querying และ indexing capabilities ที่ขาดหายไปจาก Redis

มาดูว่าจะเกิดอะไรขึ้นถ้าเรา mark fields บน Customer model เป็น `index=True` ตอนนี้เราสามารถใช้โมเดล query ได้:

Syntax นี้อาจดูคุ้นเคย— มันเป็น blend ของทุกอย่างที่ฉันชอบใน Peewee, SQLAlchemy, และ Django ORM

Embedded models

เมื่อคุณสร้างโมเดลข้อมูลซับซ้อนกับ Redis คุณจะอยากจัดเก็บ embedded data อย่างเป็นธรรมชาติ ถ้าคุณสร้างโมเดลข้อมูลลูกค้าด้วย Redis Hashes คุณอาจอยากจัดเก็บข้อมูลอย่างที่อยู่จัดส่งของลูกค้าภายใน Hash ของลูกค้าคนเดียว น่าเสียดาย Redis Hashes ไม่สามารถจัดเก็บ nested containers เช่น Lists, Sets, หรือ Hashes อื่นๆ ได้ ดังนั้นจึงไม่ได้

นี่คือที่ที่การจัดเก็บข้อมูลเป็น native JSON object ทำให้มีความหมายมาก ถ้าคุณสร้างโมเดลข้อมูลลูกค้าเป็น JSON document คุณสามารถ embed อะไรก็ได้ภายใน record ของลูกค้าคนเดียว

อย่างไรก็ตาม Redis ไม่รองรับ JSON แบบ native นี่คือเหตุผลที่เราสร้าง RedisJSON module ที่ source-available RedisJSON ทำให้เป็นไปได้ที่จะใช้ Redis เป็น document database จัดเก็บและ query JSON objects ที่ซับซ้อนได้อย่างง่ายดาย

ด้วย Redis OM สำหรับ Python ถ้า Redis instance ของคุณมี RedisJSON ติดตั้ง คุณสามารถใช้ class JsonModel คลาสโมเดลนี้ให้คุณ embed JsonModels ภายใน JsonModels อื่นๆ จินตนาการ customers มี array ของ orders แต่ละอันมี array ของ items และต่อไป

นี่คือ embedded JSON models กับ Redis OM สำหรับ Python:

ไม่ได้แค่ความยืดหยุ่นจัดเก็บ JSON objects ที่ซับซ้อน แต่ Redis OM สำหรับ Python ยังรู้จักโครงสร้าง nested เหล่านี้ และให้คุณเขียน query expressions ต่อพวกเขา Awesome!

ลอง Redis OM สำหรับ Python

หวังว่าคุณจะเห็นว่าฉันตื่นเต้นกับ Redis OM สำหรับ Python มากแค่ไหน ฉันทำงานรวบรวมบางอย่างที่ดีที่สุดของ Python ecosystem ปัจจุบันมารวมกัน เพื่อจัดการความซับซ้อนสำหรับนักพัฒนา Redis ที่ในความคิดเห็นของฉัน ไม่ควรมีใครต้องจัดการ

ถ้าฉันทำให้คุณสนใจ ดู getting started tutorial Redis OM สำหรับ Python อยู่ใน ขั้นตอนแรกมาก ที่เราเรียกว่า “Preview” ดังนั้นมี rough spots คุณจะเจอ bugs และเรากำลังทำงานเพื่อส่งเอกสารครบถ้วน แต่วิสัยทัศน์อยู่ที่นั่น และฉันสนับสนุนให้คุณลองดู

สุดท้าย ฉันจะบอกว่าเราเริ่มจาก declarative data models แต่มันมีอะไรมากกว่านี้ที่เราอยากสร้าง— ทั้งสำหรับ data modeling และมากกว่านั้น ติดตาม Redis OM features ที่น่าตื่นเต้นเพิ่มเติม!