㈠ 如何查看在Django模型创建的sql语句
Django提供了sql,sql_all命令来生成MODEL的SQL语句,当定义好Django Model后,可以在初始化调用Syncdb方法来自动在数据库里面生成相应的表。
Model定义如下:
class TestModel(models.Model):
Name=models.CharField(max_length=64,blank=True)
>>> from django.core.management.color import no_style
#Style是用来输出语句时着色的
>>> from django.db import connection
>>> from django.db.backends import creation
#这里面有个类BaseDatabaseCreation,就是用来生成SQL语句的。
>>> T=TestModel()
>>> c=creation.BaseDatabaseCreation(connection)
>>>c.sql_create_model(T,no_style())[0]
['CREATE TABLE "abc" (\n "id" integer NOT NULL PRIMARY KEY,\n "Theme" varchar(64) NOT NULL\n)\n;']
㈡ django怎么创建mysql数据库
Model是django项目的基础, 如果一开始没有好好设计好, 那么在接下来的开发过程中就会遇到更多的问题. 然而, 大多数的开发人员都容易在缺少思考 的情况下随意的增加或修改model. 这样做的后果就是, 在接下来的开发过程中, 我们不得不做出更多努力...
㈢ django使用已有的数据库表怎么建立model
在网上看到都是使用Django的models和makemigration,migrate命令来创建新表,并使用。可是我的数据已经存在了已经创建好,并且已经存储有数据了,不能再重新创建新表了。了解Django的表明和models名称的映射关系就可以让Django使用已经存在的表。
假如在Django存在models如下:
[python]view plain
fromdjango.dbimportmodels
#Createyourmodelshere.
classSciencenews(models.Model):
id=models.CharField(max_length=36,primary_key=True)
first_mole=models.CharField(max_length=30,default="News")
second_mole=models.CharField(max_length=30,default="LatestNews")
title=models.CharField(max_length=300)
author=models.CharField(max_length=60,null=True)
publish_date=models.CharField(max_length=35,null=True)
content=models.TextField(null=True)
crawl_date=models.CharField(max_length=35,null=True)
from_url=models.CharField(max_length=350,null=True)
- 执行数据迁移命令:
pythonmanage.pymakemigration
pythonmanage.pymigrate
- 会在数据库中生成名称为show_sciencenews的数据表。show为应用名称,此处我的应用名称为show。可以看到Django创建表的命名规则:应用名_模型名。
[python]view plain
我的存储爬取到的数据的表格名称原来为science_news,想要Django使用它,而不是创建新的表,只需要把的它的名称改为:应用名_要与该表映射的models名称,在此处我改为show_sciencenews。然后使用如上的数据迁移命令,这时可能会提示数据表已经存在的错误,不用理会,models已经和数据表映射上了。接下来只需要正常使用models和数据表就可以了。
㈣ 为什么很多人都喜欢 Django 的 ORM 而不是 SQLAlchemy,是因为简单...
sqlalchemy使用上有两个层次,1是使用sql expression, 说白可以让你用python写sql, 2是它的orm, orm是使用session的,自行管理session生存期,自行在多个过程中传递session,自行管理事务。写法上是通常的transaction script(java常说的贫血的domain model)模式。实际编码通常1和2混合编程。
django通过中间件部分隐藏了连接/事务管理的概念,写法上也比较简单,接近java常说的充血的domain model. 内容上也没有sqlalchemy 的sql expression层次。 易用性就体现出来了。
不过用过的orm中,能达到sqlalchemy这样高度的orm, 还没有在其他语言中看到。 ruby有sequal, java的jooq都有部分sqlalchemy思想的影子。
㈤ 如何将django orm模型 写入数据库
假如你有一个app叫做myapp,模型models.py代码如下:
fromdjango.dbimportmodels
classPerson(models.Model):
first_name=models.CharField(max_length=30)
last_name=models.CharField(max_length=30)
django数据库迁移一般就两个命令,命令行执行
1,生成数据表
python manage.py migrate
相当于执行下面sql语句
CREATETABLEmyapp_person(
"id"serialNOTNULLPRIMARYKEY,
"first_name"varchar(30)NOTNULL,
"last_name"varchar(30)NOTNULL
);
2,修改模型models.py字段后可以用重建命令,我们在模型中添加一个字段
fromdjango.dbimportmodels
classPerson(models.Model):
first_name=models.CharField(max_length=30)
last_name=models.CharField(max_length=30)
bothday=models.DateField("生日",default=datetime.date.today)
然后在命令行执行
python manage.py makemigrations
最后执行命令python manage.py runserver,即可在本地浏览器打开127.0.0.1:8000
㈥ django修改了model会自动修改数据库吗
目前到django1.7 为止
修改model的前提是:你已经创建完model,并且已经 使用 syncdb 或 migrate 创建了相应的数据库表。
然后再 修改model,不会对数据库表产生任何修改的。
具体的东西,自己去看 Django 相应版本的文档去吧
不同版本,不太一样。
㈦ 话说Django orm模型为什么比原生的mysqldb慢
首先确认下mysql索引问题.
进入mysql,查看索引情况 , 命中索引.
mysql> explain SELECT sum(idate_count) FROMbuzz_keyword_historyWHERE (buzz_keyword_history.date< ’2015-09-20 00:00:00′ ANDbuzz_keyword_history.date>= ’2015-09-01 00:00:00′ ANDbuzz_keyword_history.value= ‘手机’);
+—-+————-+———————-+——+——————————–+———-+———+——-+——+————————————+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+———————-+——+——————————–+———-+———+——-+——+————————————+
| 1 | SIMPLE | buzz_keyword_history | ref | in_value,in_idate,search_speed | in_value | 182 | const | 1514 | Using index condition; Using where |
+—-+————-+———————-+——+——————————–+———-+———+——-+——+————————————+
1 row in set (0.00 sec)
然后在看了下mysql服务器的负载情况,load特别的底下.
Python
avg-cpu: %user %nice %system %iowait %steal %idle
2.80 0.00 1.22 0.41 0.00 95.57
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sdc 0.00 808.61 21.65 27.02 5531.93 6685.05 251.00 0.55 11.39 0.71 3.45
sdb 0.00 126.81 3.30 4.95 823.13 1054.05 227.75 0.37 44.44 1.50 1.24
sda 0.06 215.50 2.46 7.87 599.12 1786.94 231.10 0.81 78.76 1.37 1.41
memdiska 0.00 0.00 585.63 2638.44 84515.95 21107.53 32.76 0.15 0.05 0.03 8.54
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 4.39 1.13 0.00
接着在mysql server开启了慢查询及sql语句调试模式,发现slow.log没有特别的日志…都是跟本业务无关的慢查询.
整个页面的静态文件也是加载正常,速度也是给力,虽然在nginx里没有配置强制缓存… 但为毛数据加载这么慢 ,为毛 ?
最后不得不重新怀疑mysql查询,我们开始统计整个django orm语句消耗的时间,一看非常的惊人,居然消耗了6秒的时间… 原本以为django 的orm只是帮助我们做了sql语句的映射,说实话我以前还真的就这么想。
Python
run_func.objects.filter(date__gte=d[0], date__lt=d[1],value=value).aggregate(Sum(idate_or_cdate + '_count'))
又看了django orm model的介绍,这django模型不简单呀,他的返回值是querysets类型。 也就是说,他会把orm执行的结果,转换成queryset结构 。 就因为这样被封装,所以我们每次用orm感觉特别友好的原因。
解决的方法,直接走原生的mysql sql语句,在python下你的选择 mysqldb,也可以用django的connection。推荐用connection,因为大家的db地址配置都是放在settings.config里面的。
下面是django 运行原始sql语句的方法,大家参考下..
Python
from django.db import connection, transaction
import MySQLdb
.......
cursor = connection.cursor(cursorclass = MySQLdb.cursors.DictCursor)
cursor.execute(sql,None)
如果你有多个数据库,可以在connections选择数据库。
from django.db import connections
cursor = connections['xiaorui'].cursor()
transaction.commit_unless_managed(using='xiaorui')
最终的结果,使用原生的sql语句用了不到1秒,而用django的orm是6秒左右.. 快了好几倍…
我觉得django orm应该多加个是否要转换成queryset的参数,这样我们根据需求来进行配置。 下面是我用django debug的结果.. 可以看到速度提升了不少.
㈧ 为什么django创建新应用model同步到数据库中失败
报错 mole 'django.db.models' has no arrtbute 'Models'
models.Model 这个后面大写的对象是没有s 的,字母拼写错误
正确的如下:
class Topic(models.Model):
㈨ python django models创建mysql数据库表default、blank属性失效
default属性只在Django的ORM模型中有效,不会真正映射到数据库里。要设置数据表的DEFAULT属性,你可以手动修改makemigrations生成的脚本,或者去修改Django本身。
在db/backends/creation.py中找到如下字段:
iff.primary_key:
field_output.append(style.SQL_KEYWORD('PRIMARYKEY'))eliff.unique:
field_output.append(style.SQL_KEYWORD('UNIQUE'))
在之后加上:
if(f.default!=models.fields.NOT_PROVIDED):
field_output.append(style.SQL_KEYWORD('DEFAULT'+str(f.default)))
㈩ django 单个models 可以定义多少个表
首先题主用的Django版本是什么,django貌似没见过ForeignModel,根据orm,ForeignKey实际上就是sql里面的外键,个人理解楼主的题目是能不能一个字段对应多个其他表,如下:
class WhatAreYouTryToAsk:
filed_XXX = models.ForeignKey((ModelA,ModelB,))
这是不科学的啊亲,对于sql来说也不会一个字段能对应多个外键,想实现这种效果只能是有一张ModelA,ModelB的中间表,而filed的外键对应这张中间表
class MiddleTable(models.Model):
model_a = models.ForeignKey(ModelA)
model_b = models.ForeignKey(ModelB)
class WhatAreYouTryToAsk:
filed_XXX = models.ForeignKey(MiddleTable)
简单的说就是ModelA和ModelB有一个多对多的关系,上面的方法是显示的指明一个MiddleTable表,实时上可以使用Django里面的ManyToMany,ManyToMany的实际上会建一张中间表,因此你可以在ModelA或ModelB建立一个ManyToMany的字段,具体ManyToMany的用法请查阅文档。
class ModelA(models.Model):
model_bs = ManyToMany(ModelB)
class WhatAreYouTryToAsk:
filed_XXX = models.ForeignKey(ModelA)
# or this, 具体实现看需求
# filed_XXX = models.ForeignKey(ModelB)