[파이썬] Peewee Recursive relationships 설정

Peewee is a lightweight Python Object Relational Mapper (ORM) that provides a simple and intuitive way to interact with databases. One of the advanced features of Peewee is the ability to establish recursive relationships between tables. This enables you to model complex hierarchical data structures in your database.

In this blog post, we will explore how to set up and work with recursive relationships in Peewee.

What is a Recursive Relationship?

A recursive relationship, also known as a self-referential relationship, occurs when a table is related to itself. This means that a row in the table can have a foreign key that points back to another row in the same table.

For example, consider a table called Category that represents a hierarchical category structure. Each category can have multiple child categories, and a child category can have further child categories. This creates a recursive relationship where each category can reference its parent category.

Setting up Recursive Relationships in Peewee

To set up a recursive relationship in Peewee, you need to define a foreign key field that references the same table. Let’s take a look at an example to understand how to configure recursive relationships in Peewee.

from peewee import *

database = SqliteDatabase('mydatabase.db')

class Category(Model):
    name = CharField()
    parent = ForeignKeyField('self', backref='children', null=True)

    class Meta:
        database = database

In the Category model, we define a foreign key field called parent that references the Category model itself. The backref parameter allows us to create a reverse relationship, enabling us to access the child categories of a parent category.

Note that we set null=True for the parent field, as the top-level categories will not have a parent.

Using Recursive Relationships in Queries

Once we have configured the recursive relationship, we can use it in our queries to traverse the hierarchy of categories. Here are some examples of how you can work with recursive relationships in Peewee:

1. Inserting data:

# Creating top-level categories
category1 = Category.create(name='Books')

# Creating child categories
category2 = Category.create(name='Python', parent=category1)
category3 = Category.create(name='JavaScript', parent=category1)

# Creating nested child categories
category4 = Category.create(name='Web Development', parent=category2)

2. Retrieving parent category:

category = Category.get(Category.name == 'Python')
parent_category = category.parent

In this example, we retrieve the category called ‘Python’ and then access its parent category.

3. Retrieving child categories:

category = Category.get(Category.name == 'Books')
child_categories = category.children

Here, we retrieve the category called ‘Books’ and then access its child categories.

4. Traversing the entire category hierarchy:

def print_category_hierarchy(category, indent=0):
    print(' ' * indent, category.name)
    for child_category in category.children:
        print_category_hierarchy(child_category, indent + 4)
        
top_category = Category.get(Category.name == 'Books')
print_category_hierarchy(top_category)

In this example, we define a recursive function print_category_hierarchy that prints the category hierarchy in an indented format.

Conclusion

Recursive relationships in Peewee allow you to represent hierarchical structures in your database, such as nested categories. By setting up foreign key fields that reference the same table, you can navigate and query the hierarchy with ease. Peewee makes working with recursive relationships straightforward and intuitive.

For more information on Peewee and its features, refer to the official documentation: https://docs.peewee-orm.com/

I hope this blog post has provided you with a clear understanding of how to set up and use recursive relationships in Peewee. Happy coding!