Django中,我们使用models来定义表,并且尽量不要跳过Django手动操作数据表。
参考:http://python.usyiyi.cn/translate/django_182/intro/tutorial01.html
models.py中每个模型相当于一个数据库表,每个属性代表一个字段,属性名就是字段名。字段类型CharField相当于SQL中varchar类型,IntegerField相当于SQL中int类型。
models.py:
- #机柜
- class cabinet(models.Model):
- name = models.CharField('名称',max_length=30)
- power = models.CharField('权限',max_length=20)
- class Meta:
- db_table = "cabinet"
- #服务器
- class server(models.Model):
- int_ip = models.CharField('内网IP地址',max_length=50)
- ext_ip = models.CharField('外网IP地址', max_length=50)
- mac_address = models.CharField('MAC地址',max_length=50)
- hostname = models.CharField('主机名',max_length=50)
- os = models.CharField('系统',max_length=50)
- status = models.IntegerField('状态')
- gateway = models.CharField('网关',max_length=50)
- cpu_model = models.CharField('CPU型号',max_length=100)
- cpu_thread_number = models.PositiveIntegerField('CPU线程数')
- server_disk = models.CharField('磁盘',max_length=20)
- server_mum = models.IntegerField('内存')
- manufacture_date = models.DateField('生产日期')
- manufacturers = models.CharField('生产商',max_length=30)
- cabinet_id = models.IntegerField('机柜ID')
- server_run = models.CharField('运行的服务',max_length=30)
- class Meta:
- db_table = "server"
- #服务列表
- class product(models.Model):
- service_name = models.CharField('服务名称',max_length=20)
- pid = models.IntegerField('pid')
- module_letter = models.CharField(max_length=10)
- class Meta:
- db_table = "product"
通过运行makemigrations告诉Django,已经对模型做了一些更改(在这个例子中,你创建了一个新的模型)并且会将这些更改记录为迁移文件。
- E:\DjangoWeb>python manage.py makemigrations
- Migrations for 'webserver':
- webserver\migrations\0002_cabinet_product_server.py
- - Create model cabinet
- - Create model product
- - Create model server
迁移是 Django 如何储存模型的变化(以及您的数据库模式),它们只是磁盘上的文件。如果愿意,你可以阅读这些为新模型建立的迁移文件;这个迁移文件就是 polls/migrations/0001_initial.py。不用担心,Django不要求你在每次Django生成迁移文件之后都要阅读这些文件,但是它们被设计成可人为编辑的形式,以便你可以手工稍微修改一下Django的某些具体行为。
sqlmigrate命令接收迁移文件的名字并返回它们的SQL语句,我们可以检查SQL语句是否与我们的初衷相符:
注意:在旧版本中用sqlall来查看Django会执行的SQL语句,新版本中sqlmigrate是最接近sqlall功能的,但并不等价。
- E:\DjangoWeb>python manage.py sqlmigrate webserver 0002
- BEGIN;
- --
- -- Create model cabinet
- --
- CREATE TABLE `cabinet` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(30) NOT NULL, `power` varchar(20) NOT NULL);
- --
- -- Create model product
- --
- CREATE TABLE `product` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `service_name` varchar(20) NOT NULL, `pid` integer NOT NULL, `module_letter` varchar(10) NOT NULL);
- --
- -- Create model server
- --
- CREATE TABLE `server` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `int_ip` varchar(50) NOT NULL, `ext_ip` varchar(50) NOT NULL, `mac_address` varchar(50) NOT NULL, `hostname` varchar(50) NOT NULL, `os` varchar(50) NOT NULL, `status` integer NOT NULL, `gateway` varchar(50) NOT NULL, `cpu_model` var
- char(100) NOT NULL, `cpu_thread_number` integer UNSIGNED NOT NULL, `server_disk` varchar(20) NOT NULL, `server_mum` integer NOT NULL, `manufacture_date` date NOT NULL, `manufacturers` varchar(30) NOT NULL, `cabinet_id` integer NOT NULL, `server_run` varchar(30) NOT NULL);
- COMMIT;
如果SQL正确,那么运行迁移来在数据库中创建这个表:
- E:\DjangoWeb>python manage.py migrate
- Operations to perform:
- Apply all migrations: admin, auth, contenttypes, sessions, sites, webserver
- Running migrations:
- Applying webserver.0002_cabinet_product_server... OK
检查数据库是否创建成功:
请注意以下几点:
- 输出的具体内容会依据你使用的数据库而不同。 以上例子使用的数据库是MySQL。
- 表名是自动生成的,由app的名字(polls)和模型名字的小写字母组合而成 —— question和choice。(你可以重写这个行为。)
- 主键(id)是自动添加的。(你也可以重写这个行为。)
- 按照惯例,Django会在外键的字段名后面添加 "_id"。(是的,你依然可以重写这个行为。)
- 外键关系由FOREIGN KEY约束显式声明。不用在意DEFERRABLE部分;它只是告诉PostgreSQL直到事务的最后再执行外键关联。
- 这些SQL语句是针对你所使用的数据库定制的,所以会为你自动处理某些数据库所特有的字段例如auto_increment (MySQL)、 serial (PostgreSQL)或integer primary key autoincrement (SQLite) 。在处理字段名的引号时也是如此 —— 例如,使用双引号还是单引号。
- sqlmigrate命令并不会在你的数据库上真正运行迁移文件 —— 它只是把Django 认为需要的SQL打印在屏幕上以让你能够看到。 这对于检查Django将要进行的数据库操作或者你的数据库管理员需要这些SQL脚本是非常有用的。
如果有兴趣,你还可以运行python manage.py check;它会检查你的项目中的模型是否存在问题,而不用执行迁移或者接触数据库。