㈠ 如何查看在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)