掌握Django(三)

本文介绍从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。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注