ITADN
themotte/rDrama
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

Build status

此代码运行 https://www.themotte.org

加入 Dev Discord 寻求帮助。

安装(Windows/Linux/MacOS)

1 - 在你的机器上安装 容器运行时和 Docker 命令行工具

在 Windows 上,Docker 会不断催促你付费购买许可证。如果你想要一个不那么专有的替代品,请考虑使用 Container DesktopStevedore

2 - 安装 Git。如果你在 Windows 上并且想要一个 GUI,Github Desktop 相当不错。

3 - 首次设置时,在终端或命令行中运行以下命令:

git clone https://github.com/themotte/rDrama/

cd rDrama

4 - 运行以下命令以启动站点:

docker compose up --build

第一次执行此操作时,会花费一些时间。下次会(快得多)。

4 - 在浏览器中访问 localhost

5 - 创建一个账户。第一个创建的账户将拥有管理员权限。

6 - 就这样!

大多数代码编辑会(几乎)立即生效。如果你进行了任何配置更改或数据库更改,你需要 ctrl-C 掉 docker 状态日志并再次运行 docker compose up --build

与聊天相关的代码编辑需要一分钟才能更新(如果是 Python)或者根本不会自动反映(如果是 React)。欢迎提出改进建议!但几乎没有人会触及这些系统,因此这一直不是优先事项。

运行 E2E 测试:

./util/test.py

数据库相关内容

什么是迁移?

在 themotte 从 rDrama 分叉之前,没有数据库迁移,数据库模式存储在 schema.sql 中。每当向模型添加列或类似内容时,人们只能希望作者记得更新 schema.sql 以添加该列。我们在分叉此仓库后所做的最初更改之一,就是使用 Alembic 添加数据库迁移。

数据库迁移是将过时的数据库转换为最新数据库的指令。这可能涉及更改模式,或更改数据库内的数据。

为什么使用数据库迁移

数据库迁移允许我们在模式变更时指定数据的迁移位置。这在生产环境中至关重要——如果我们为了命名一致性或其他原因将 comments.ban_reason 列重命名为 comments.reason_banned,并且通过删除 ban_reason 列并添加一个 reason_banned 列来实现,我们将丢失该列中的所有用户数据。我们不希望这样做。通过迁移,我们可以指定该操作应为列重命名,或者,如果数据库引擎不支持重命名列,则应执行“添加新列、迁移数据、删除旧列”的三步流程。

数据库模式变更工作流

举个例子,假设我们想向 comments 表添加一列 is_flagged

  1. 更新 files/classes/comment.py 中的 Comment 模型
	from files.classes.base import Base
	class Comment(Base):
		__tablename__ = "comments"
		id = Column(Integer, primary_key=True)
		...
+		is_flagged = Column(Boolean, default=False, nullable=False)
  1. 使用描述性消息自动生成迁移。为此,请运行
./util/command_flask.py db revision --autogenerate --message="add is_flagged field to comments"

这将在 migrations/versions 目录中创建一个名为 migrations/versions/2022_05_23_05_38_40_9c27db0b3918_add_is_flagged_field_to_comments.py 的迁移,其内容如下

"""add is_flagged field to comments
Revision ID: 9c27db0b3918
Revises: 16d6335dd9a3
Create Date: 2022-05-23 05:38:40.398762+00:00
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '9c27db0b3918'
down_revision = '16d6335dd9a3'
branch_labels = None
depends_on = None
def upgrade():
    op.add_column('comments', sa.Column('is_flagged', sa.Boolean(), nullable=False))
def downgrade():
    op.drop_column('comments', 'is_flagged')
  1. 检查自动生成的迁移,确保一切看起来正确(它添加了预期要添加的列,且没有添加其他内容,所有约束都有命名等)。如果你在其中一个 alembic 操作中看到 None,例如 op.create_foreign_key_something(None, 'usernotes', 'users', ['author_id']),请在提交迁移之前将其替换为描述性字符串。

  2. 重启 Docker 容器以确保其正常工作。

docker compose up --build

那么 original-schema.sql 是怎么回事,我可以直接修改它吗?

不,请不要这样做。相反,请按照上述说明创建一个迁移。