数据表配置
# 准备工作
若您的插件有数据表需求,您可以在插件目录创建一个 database
目录,并创建一个 database.py
文件作为初始化数据表文件。
注意
初始化数据表文件必须永远为最新版本!
# 说明
Madoka 使用 peewee 框架作为 ORM,支持 MySQL 和 SQLite 数据库。
# 初始化数据表
使用 peewee 框架,您需要在 database.py
文件中继承 ORM
类来映射数据表对象。
from peewee import *
from app.util.dao import ORM
class Test(ORM):
id = AutoField()
name = CharField()
age = IntegerField()
create_time = DateTimeField()
Test.create_table() # 以该语句结束
您可以在 database.py
文件中创建多个数据表对象,但是每个对象都必须调用一次 create_table()
方法,否则 Madoka 无法初始化您的数据库。
提示
关于 peewee 的详细用法,您可以参考 peewee 官方文档 (opens new window)。
# 更新数据表
为了保证用户数据表永远是最新版本,在数据表每次有变动时,都应创建一个以 {日期}-{时间}.sql
为名的 sql
文件,在其中写下对应的修改语句。并修改 database.sql
文件,让其保持最新。
更新文件命名时间必须不低于推送代码时间,若您仅是自己使用,时间应不低于上次更新时间。
# 内容格式
由于支持 MySQL 和 SQLite,所以您需要在 sql
文件中分别写 MySQL 和 SQLite 的修改语句。
每条语句以数据库类型开头,以 ;
结尾。如: mysql: .......;
mysql: ALTER TABLE test MODIFY COLUMN name VARCHAR(255) NOT NULL;
sqlite: ALTER TABLE test RENAME TO test_temp;
sqlite: CREATE TABLE test (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
name VARCHAR(255) NOT NULL,
create_time DATETIME NOT NULL
);
sqlite: INSERT INTO test (id, name, create_time) SELECT id, name, create_time FROM test_temp;
sqlite: DROP TABLE test_temp;
提示
若二者修改语句完全一致,您可以去掉语句前的数据库类型,只写一次。
ALTER TABLE test RENAME TO test1;
# 时间格式
年月日-时分.sql
年: 4 位
月: 2 位
日: 2 位
时: 2 位
分: 2 位
# 完整示例
- database.py
from peewee import *
from app.util.dao import ORM
class Demo(ORM):
name = FixedCharField(4)
"""属性名"""
uid = IntegerField()
"""用户 ID"""
datetime = DateTimeField(null=True)
"""修改时间"""
value = CharField(max_length=256)
"""属性值"""
class Meta:
primary_key = CompositeKey('name', 'uid')
- 20220729-1900.sql
mysql: alter table demo add datetime datetime null comment '修改时间' after name;
sqlite: alter table demo rename to demo_temp;
sqlite: create table demo (
name char(4) not null,
uid integer not null,
datetime datetime null,
value varchar(256) not null,
primary key (name, uid)
);
sqlite: insert into demo (name, uid, value) select name, uid, value from demo_temp;
sqlite: drop table demo_temp;
上次更新: 2022/11/22, 00:08:13