gpt4 book ai didi

python - Peewee 和数据库继承

转载 作者:太空宇宙 更新时间:2023-11-04 01:18:54 26 4
gpt4 key购买 nike

我正在尝试通过制作书籍笔记应用程序来学习 Peewee 和 Bottle。

假设我有以下实体:

Subject
Book
Chapter
Note
Tag

我希望能够为章节、书籍和主题做笔记。

在数据库中,你会做:

create table noteable (
noteable_id INT AUTO_INCREMENT PRIMARY KEY
,type VARCHAR(10) NOT NULL CHECK (type in ('SUBJECT','BOOK','CHAPTER','NOTE'))
);
create table subject (
subject_id INT AUTO_INCREMENT PRIMARY KEY
,noteable_id INT UNIQUE REFERENCES noteable (noteable_id)
,...
);
create table book (
book_id INT AUTO_INCREMENT PRIMARY KEY
,subject_id INT NOT NULL REFERENCES subject (subject_id)
,noteable_id INT UNIQUE REFERENCES noteable (noteable_id)
,...
);
create table chapter(
chapter_id INT AUTO_INCREMENT PRIMARY KEY
,book_id INT NOT NULL REFERENCES book (book_id)
,noteable_id INT UNIQUE REFERENCES noteable(noteable_id)
,...
);

create table note(
note_id INT AUTO_INCREMENT PRIMARY KEY
,noteable_id INT UNIQUE REFERENCES noteable(noteable_id)
,...
);

(如果你想在 note 和 notable 之间建立 M:N 关系,你也可以做一个 note_notable 桥接表)。

您将在主题、书籍和章节上插入触发器,将一行插入到 noteable 中,检索新行的 noteable_id,并将其用于传入行。

我假设如果您正在使用像 Peewee 这样的 ORM,您会希望在应用程序逻辑而不是触发器中执行此操作。

如何在 Peewee 中实现此模型?

最佳答案

我是这样做的。我在 Peewee 中找不到实现继承的 native 方法,所以我自己动手了。如果有更好的方法,请提供您的答案,我会奖励它。

import MySQLdb
import peewee
from peewee import *
from datetime import datetime

db = MySQLDatabase('test', user='root',passwd='psswd')

class BaseModel(Model):
class Meta:
database = db

class Noteable(BaseModel):
type = CharField(null = False)

# This will act as the trigger that inserts a row into noteable,
# and retrieves the notable.id to use
class N(BaseModel):
def save(self, *args, **kwargs):
if not self.id:
noteable = Noteable(type=self.__class__.__name__.upper())
noteable.save()
self.noteable = noteable.id
return super(N, self).save(*args, **kwargs)

class Subject(N):
name = CharField(null = False, unique = True)
noteable = ForeignKeyField(Noteable, related_name="noteablesubject", null= False, unique = True)


class Book(N):
name = CharField(null = False, unique = True)
subject = ForeignKeyField(Subject, related_name="books", null = False)
noteable = ForeignKeyField(Noteable, related_name="noteablebook", null= False, unique = True)


class Chapter(N):
name = CharField(null = False)
chapter_number = IntegerField(null = False)
book = ForeignKeyField(Book, related_name="chapters")
noteable = ForeignKeyField(Noteable, related_name="noteablechapter", null= False, unique = True)


class Note(BaseModel):
note = TextField(null = False)
# N.B. unique is not true, as multiple notes can go to the same subject/book/chapter
noteable = ForeignKeyField(Noteable, related_name="notes", null= False)


Note.drop_table(True)
Chapter.drop_table(True)
Book.drop_table(True)
Subject.drop_table(True)
Noteable.drop_table(True)

Noteable.create_table(True)
Subject.create_table(True)
Book.create_table(True)
Chapter.create_table(True)
Note.create_table(True)

s = Subject(name="subject")
s.save()
n = Note(note="subject notes", noteable = s.noteable)
n.save()
n = Note(note="subject notes 2", noteable = s.noteable)
n.save()
b = Book(name="book", subject=s)
b.save()
n = Note(note="book notes", noteable = b.noteable)
n.save()
n = Note(note="book notes 2", noteable = b.noteable)
n.save()
c = Chapter(chapter_number=1, name="chapter", book=b)
c.save()
n = Note(note="chapter notes", noteable=c.noteable)
n.save()
n = Note(note="chapter notes 2", noteable=c.noteable)
n.save()

(如果你希望在笔记和名人之间建立多对多关系,你必须定义一个带有外键的 NoteNotable 类并从 Note 中删除 FK)

你可以定义一个辅助方法来左连接任何带有注释的类:

def get_notes(clazz, id):
return clazz.select().join(Noteable).join(Note, JOIN_LEFT_OUTER).where(clazz.id = id)

您可以像这样迭代它:

% for note in chapter.noteable.notes:

% end

这是 SELECT * FROM NOTABLE;

的结果
+----+---------+
| id | type |
+----+---------+
| 1 | SUBJECT |
| 2 | BOOK |
| 3 | CHAPTER |
+----+---------+

这是 SELECT * FROM NOTE;

的结果
+----+-----------------+-------------+
| id | note | noteable_id |
+----+-----------------+-------------+
| 1 | subject notes | 1 |
| 2 | subject notes 2 | 1 |
| 3 | book notes | 2 |
| 4 | book notes 2 | 2 |
| 5 | chapter notes | 3 |
| 6 | chapter notes 2 | 3 |
+----+-----------------+-------------+

关于python - Peewee 和数据库继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22582689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com