游客发表

django中创建数据库

发帖时间:2026-10-17 04:48:08

django中创建数据库

Django的中创ORM把数据库操作变成了Python对象操作,但真正动手建库时,建数据库新手常被settings里的中创配置绊倒。拿MySQL举例,建数据库你光在DATABASES字典里填上ENGINE和NAME还不够——数据库得先存在,中创否则migrate会直接报错Unknown database。建数据库我见过有人卡在这步半小时,中创就为了一条CREATE DATABASE命令。建数据库

先聊聊配置。中创默认的建数据库sqlite3不需要任何外部服务,文件即库,中创适合本地测试。建数据库但生产环境通常换PostgreSQL或MySQL,中创这时你得写全参数:HOST、建数据库PORT、中创USER、PASSWORD,外加一个OPTIONS里的charset。别图省事省略HOST,默认值localhost在容器化部署时大概率连不上——我踩过这坑,Docker里服务名是db,不是localhost。

创建数据库本身不归Django管。你得手动进MySQL客户端执行CREATE DATABASE mydb CHARACTER SET utf8mb4;,或者用django-admin的shell跑一段Python代码。但更干净的做法是写个初始化脚本,比如setup_db.sql,里面放建库语句和授权命令,部署时一条mysql < setup_db.sql搞定。别在代码里硬编码建库逻辑,那会让测试环境每次跑都报“数据库已存在”。

模型定义才是重头戏。你写class User(models.Model),字段类型决定了数据库列类型。比如CharField(max_length=50)映射到MySQL的varchar(50),IntegerField变成int。但有个细节:AutoField是自增主键,如果你不声明primary_key=True,Django会自动加一个id列。这没问题,可当你想用UUID做主键时,得写models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)——注意default必须是可调用对象,不是uuid.uuid4()带括号那种,否则每个实例共享同一个值。

跑python manage.py makemigrations时,Django会生成迁移文件,像是数据库的“版本控制”。这步经常出幺蛾子:你改了模型但忘了生成迁移,直接migrate会提示“没有变更”。反过来,如果多人协作,别人已经生成了迁移文件,你拉代码后得先migrate再makemigrations,否则可能冲突。我习惯每次提交代码前检查git status,确保迁移文件是干净的。

最后说个容易忽略的点:migrate不只是建表,它还会创建Django自带的auth_user、session等系统表。这意味着你第一次执行时,数据库里会多出十几张表,别慌,那是正常的。如果你只想建业务表,可以用python manage.py migrate --run-syncdb,但官方不推荐——它不会记录迁移历史,后续改表结构会麻烦。

建库的坑大多在环境差异上。本地用SQLite跑得欢,上了服务器换MySQL,结果TextField的排序规则不一样,中文搜索出问题。所以最好从第一天就统一数据库类型,哪怕本地用Docker起个MySQL容器,也就一条docker run的事。数据库这东西,越早贴近生产环境,后期越省心。

    热门排行

    友情链接