- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试通过制作书籍笔记应用程序来学习 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/
我正在将 Peewee 用于我正在进行的一个项目,并且我正在尝试弄清楚如何动态设置数据库,以便我可以使用一个用于生产,一个用于测试。我见过的所有示例在任何类之外都有以下行: database = Sq
我正在努力思考 Tornado 和与 Postgresql 的异步连接。我在 http://peewee-async.readthedocs.io/en/latest/ 找到了可以执行此操作的库. 我
我有一个记录温度数据的表,其中有 120 万行。 虽然它有一个候选键,但目前没有主键。 由于 Peewee 要求所有表都有一个 ID AUTO_INCRMENT 列,我应该简单地向表中添加一个列,还是
作为练习,我从 API 中提取数据并将其插入到 psql 数据库中。我最初遵循每次拉取 1000 个条目的默认限制,但我决定尝试获取大约 40K 行的所有数据。经过一些实验后,我可以拉出 4800,但
几个月来,我一直在广泛使用 peewee 和 postgresql。突然间,这开始发生了。如果我运行任何查询命令并收到错误,则所有后续命令开始返回 peewee.InternalError: curr
我被难住了。因此,我在 peewee 中定义了三个模型: class Patient(BaseModel): patientIdx = IntegerField() gender =
有没有一种方法可以在peewee中定义自动递增字段。 我知道我们可以定义序列,但是手动创建序列而不需要由create_tables管理的需求使我无法使用它。 (构建过程由创建表管理,我不希望不添加手动
在 Peewee 中是否有一种方法或设置可以让我打印出正在执行的所有查询,以便调试和了解潜在的性能问题。 最佳答案 是的,是记录在案 :http://docs.peewee-orm.com/en/la
我需要更新整个用户表的字段。 docs中有说明我不应该遍历所有表记录。但为了计算新的字段值,我需要使用循环、用户关系和其他依赖于具体模型的复杂逻辑来执行计算。 我尝试将此计算包含在模型的属性中,但我得
我有一个表,我需要向其中添加列,其中之一是指示业务逻辑的列。因此,请将其视为“优先级”列,并且它必须是唯一的并且是整数字段。它不能是主键,但对于业务逻辑目的来说它是唯一的。 我搜索了文档,但找不到添加
class Parent(BaseModel): name = peewee.CharField() class Child(BaseModel): name = peewee.Cha
这就是我所拥有的: SomeTable.select.where(reduce(operator.or_, (SomeTable.stuff == entry for entry in big_lis
我如何知道记录是否确实已更新?这是我的代码: for team, rating in team_ratings.items(): query1 = Ratings.update(sagar
我使用 pewee 和以下查询: for row in Group.select(): group_data = process_group(row.link) Group.upda
这是一个基本示例 - 帖子由用户拥有和喜欢。如何为特定用户选择喜欢的帖子? import datetime import peewee class User(peewee.Model): na
我有一个 sqlite 数据库,用作我用 python 开发的应用程序的数据存储文件。 现在新功能的开发需要我在数据库中定义新字段。有没有一种方法可以使用 peewee 加载使用旧表定义(没有新字段)
我有一个模型,其中有一个名为 data 的字段,其类型为 jsonb: class Post(Model): ... data: Dict[str,Any] = BinaryJSONF
我希望能够连接到数据库 (PostgreSQL),其中 url 和凭据作为参数接收,而无需事先了解该方案。所以我已经知道我可以像这样在 python 中创建新类型: MyModel = type('M
我创建了一个像这样的mysql连接池: database = PooledMySQLDatabase('test', max_connections=10,
在使用 peewee + MySQL 数据库的 Python 中,是否可以在更新函数中使用一些变量作为关键字? 例如: what = raw_input('What you want to chang
我是一名优秀的程序员,十分优秀!