本文介绍从Django数据模型生成实际数据库的数据表。
设置数据库
Django原生支持的数据库引擎有
- SQLite。轻量,仅开发用
- PostgreSQL。比较常用
- MySQL。也比较常用
- MariaDB
- Oracle
也可用第三方库支持,比如SQLServer。
创建迁移
使用Django,不用手动创建数据库表,只需用命令迁移。
python manage.py makemigrations
这条命令的工作是:查看每个应用,创建迁移,保存在每个应用下,命名类似这样的以序列开头,如0001_XXX等:
migrations/0001_initial.py
这个迁移脚本是一个python模块,有专门的Migration类用以创建模型,增加字段等。
下一步,将由python模块转换成SQL语句执行数据库操作。
VSCODE小技巧:
- command+T,快速查找类、函数、变量
- command+P,快速查找文件。
按Command+T,查找Product,修改price为unit_price,
再运行:
python manage.py makemigrations
将生成一条新的迁移脚本 0002_xxxx.py,我们可以修改这个脚本的文件名,比如重命名为 0002_rename_price_to_unit_price.py。
当然,如果有其他迁移依赖这个迁移,需要修改其他迁移的对它的名字引用。
我们再执行一遍
python manage.py makemigrations
由于我们对模型未作修改运行这条命令,会提示无修改。
如果我们修改了某个模型也看到了这个提示,很可能未将应用加入到settings.py的INSTALL_APPS节中。
我们再给Product增加一个字段slug,slug的目的是为了使搜索引擎快速找到。
…
slug = models.SlugField()
…
再运行一次迁移,python manage.py makemigrations,提醒我们要增加一条无默认值的字段,希望提供默认值或重新修改字段。我们可以修改成:
slug = models.SlugField(default=’-‘)或
slug = models.SlugField(null=True)
这里我们直接提供默认值 ‘-‘。
这样就生成了0003_XXXX.py,我们也修改下名字为0003_add_slug_to_product.py。
运行迁移
执行:
python manage.py migrate
该命令将各个应用的migrations文件夹下的脚本都运行一遍,包括auth,admin,content_types等自带应用。
默认的数据库是SQLite3。
安装SQLite3扩展,或下载独立工具DB Brower for SQLite,这里用扩展方式。
command+shift+p,再输入 sqlite:open database,左侧栏就能看到 SQLLITE EXPLORE,然后就能看生成的各个数据表了,查看django_migrations表,能看应用的迁移运行情况。
再运行一次 python manage.py migrate,发现无修改,因为迁移都已执行,就是通过django_migrations表来判断的。
我们可以查看某次迁移实际的SQL语句,如:
python manage.py sqlmigrate store 0003
这个命令表示查看store应用的0003号迁移的SQL语句。不同的数据库,对应的SQL语句也是不同的。
再做一个练习:给Address添加字段zip,再运行迁移,以及检查数据库。
具体就不详列了。
定制数据库模式
有些时候希望自己命名数据库,或为某些列指定索引等,该如何做呢?
command+t,查找Customer类,在该类后面添加一个内部Meta。
class Customer(models.Model):
…
class Meta:
db_table = ‘store_customers’
# 将数据库名字改成复数,默认是store_customer
indexes = [
models.Index(fields=[‘last_name’,’first_name’])
]
再运行:
python manage.py makemigrations
python manage.py migrate
查看实际数据表已改成复数store_customers了,跟其他格格不入!所以一般建议是最好遵守Django的命名约定,避免后期的麻烦。
撤销迁移
上面的修改不是Django的约定格式,我们撤销下。
如果是部分撤销,比如不想修改数据库名,但保留创建索引,则删除掉 db_table = ‘store_customers’ 这一句,然后重新生成执行迁移就好。
如果想完全撤销上一步的迁移,则可以恢复到上一次正确的迁移。我们假设上一次的迁移是 0004
python manage.py migrate store 0004
这样就恢复到0004迁移,本次错误的迁移将被撤销,可以看到数据库表名已恢复,同时django_migrationsge表的中记录也已删除。
但在文件系统中,我们要删除这条不用的0005_XXXX.py文件,以及在Customer中添加的代码,否则下次还会产生迁移及应用。
安装MYSQL
访问mysql.com,下载安装 MySQL Community Server
设置root为强密码。
连接MYSQL
客户端有:
- Mysql workbench,免费。
- Table Plus,$59
- DataGrip , $99,目前市场上最好的数据库工具。
DataGrip明显是最优秀的,也是最贵的,有一个月的试用期。这里我们就用DataGrip。
DataGrip:New Project,名字为“storefront”,添加Data Source,选择MySQL,其他默认,用户是root,输入密码。
下载底部提示的驱动程序,测试连接成功。如果出错的话,根据提示修复,这一块DataGrip还是很智能的。
右键点击左侧的localhost,选择 New Query Console,键入SQL命令:
CREATE DATABASE storefront
Django要连接mysql数据库,必须先建立数据库才行。
在Django中使用MYSQL
先安装mysqlclient包:
pipenv install mysqlclient
这一步在MacOS可能会有些问题,可以求助google或stackoverflow.com查找出错原因和解决方法。一般可以先
brew install mysql
brew install mysql-connector-c
然后再 pipenv install mysqlclient可以解决问题。
检查连接是否正常。在控制台输入:
mysql -u root -p
出现mysql提示是正常的,否则就要检查路径是否正常等。
ctrl+ d 可以终止 mysql命令行模式。
继续:
command+p 找到settings.py
command+shift+o,打开当前文件的所有符号标签、变量、函数等,找到DATABASES节,修改default配置如下:
DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘storefront’,
‘HOST’: ‘localhost’,
‘USER’: ‘root’,
‘PASSWORD’: ‘XXXX’
}
}
其中PASSWORD由实际密码代替,而且在生产环境也在这里明文放置密码。
配置好mysql数据库后,我们再来将数据库迁移到mysql中。
python manage.py makemigrations
python manage.py migrate
检查mysql数据表,发现数据表已建立。
运行定制的SQL
有时候我们需要完全控制数据的的产生方式,这在Django很容易。步骤是:
- 编写一个空的迁移
- 在上一步的迁移中写任意的SQL代码。
我们来实操下:
python manage.py makemigrations store –empty
这一条命令表示创建一个空的迁移。
在生成的空迁移0005_XXXX.py的operations列表中增加sql语句。
…
operations = [
migrations.RunSQL(“””
INSERT INTO store_collection(title)
values(‘collection1’)
“””, “””
DELETE FROM store_collection
WHERE title=’collection1′
“””
)
]
…
RunSQL类有两个参数,第一个为修改操作数据库的语句,第二个为撤销的操作。第二个为可选参数,如果不提供则无法撤销。
我们来实际操作到数据库
python mange.py migrate
检查数据表store_collection,确已产生一条记录。
如果需要撤销应用,则可以用恢复到上一个迁移,这里是0004
python manage.py migrate store 0004
产生假数据
在开发阶段,我们有时需要用一些假数据填充我们的数据库,可以用https://mockaroo.com/网站。
比如我们要生成customer表的数据,设置相应字段,行数选1000行,格式为CSV,可点PREVIEW预览生成的数据,并下载数据。
这里我们选择Format为SQL,Table Name为store_customer,然后下载生成的sql文件。
打开DataGrip,将生成的sql文件拖进去,并确认数据库是storefront,执行。
再检查一下,确认数据表store_customer已填入数据1000行。
select count(*) from store_customer。
小结
本文介绍了从数据模型生成数据表。下一篇开始介绍Django ORM。