django資料庫操作資料庫
㈠ Django資料庫怎麼增加數據
修改setting.py裡面的DATABASES元組為
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'books', #你的資料庫名稱
'USER': 'root', #你的資料庫用戶名
'PASSWORD': '', #你的資料庫密碼
'HOST': '', #你的資料庫主機,留空默認為localhost
'PORT': '3306', #你的資料庫埠
}
}
INSTALLED_APPS = (
'books',#你的資料庫名稱
)
在mysql裡面創建books資料庫
檢查配置是否有語法錯誤
使用python manage.py sqlall books 顯示mysql語法
使用python manage.py syncdb同步模型中的資料庫
創建成功!
㈡ django怎麼使用mysql資料庫
方法/步驟
修改setting.py裡面的DATABASES元組為
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'books', #你的資料庫名稱
'USER': 'root', #你的資料庫用戶名
'PASSWORD': '', #你的資料庫密碼
'HOST': '', #你的資料庫主機,留空默認為localhost
'PORT': '3306', #你的資料庫埠
}
}
INSTALLED_APPS = (
'books',#你的資料庫名稱
)
在mysql裡面創建books資料庫
檢查配置是否有語法錯誤
使用python manage.py sqlall books 顯示mysql語法
使用python manage.py syncdb同步模型中的資料庫
創建成功!
㈢ django中怎麼動態操作資料庫欄位
django的ORM系統不支持修改刪除欄位的操作,也就是說你在寫模型model文件的時候,比如說定義了這個user表,然後包含欄位telphone定義,你一旦執行了manage.py syncdb 這個操作,就把表結構往資料庫寫死了,如果你之是刪除了model文件的telphone,資料庫是不被重新修改的。這個時候必須用原生SQL解決,也就是說自己寫SQL語句讓django執行,這樣的話會出很多問題,也就是說你執行了alter table users drop column telphone之後,你的model文件不知道你已經對users表結構做了修改,這樣會出直接導致django應用的崩潰。所以動態欄位不好做。也可能是我才疏學淺,沒太理解,也許有高人能做到。不過面對ORM這樣的盡量別刪除欄位。
㈣ 如何在django中使用多個資料庫
使用多個資料庫
New in Django 1.2: Please, see the release notes
大多數其他文檔都假設使用單一資料庫,本文主要討論如何在 Django 中使用多個資料庫。 使用多個資料庫,要增加一些步驟。
定義你的資料庫
使用多資料庫的第一步是通過 DATABASES 設置要使用的資料庫服務。這個 設置用於映射資料庫別名和特定的聯結設置字典,這是 Django 定義資料庫一貫的手法。 字典內部的設置參見 DATABASES 文檔。
資料庫可以使用任何別名,但是 default 有特殊意義。當沒有選擇其他資料庫時, Django 總是使用別名為 default 的資料庫。因此,如果你沒有定義一個名為 default 的資料庫時,你應當小心了,在使用資料庫前要指定你想用的資料庫。
以下是一個定義兩個資料庫的 settings.py 代碼片斷。定義了一個預設的 PostgreSQL 資料庫和一個名為 users 的 MySQL 資料庫:
DATABASES = { 'default': { 'NAME': 'app_data', 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'USER': 'postgres_user', 'PASSWORD': 's3krit' }, 'users': { 'NAME': 'user_data', 'ENGINE': 'django.db.backends.mysql', 'USER': 'mysql_user', 'PASSWORD': 'priv4te' } }
如果你嘗試訪問 DATABASES 設置中沒有定義的資料庫, Django 會拋出一個 django.db.utils.ConnectionDoesNotExist異常。
同步你的資料庫
syncdb 管理命令一次只操作一個資料庫。預設情況下,它操作 default 資料庫。但是加上 --database 參數,你可以讓 syncdb 同步不同的 資料庫。所以要同步我們例子中的所有資料庫的所有模型可以使用如下命令:
$ ./manage.py syncdb
$ ./manage.py syncdb --database=users
如果你不是同步所有的程序到同一個資料庫中,你可定義一個 資料庫路由 來為指定的模型實施特定的控制 策略。
如果你要精細地控制同步,那麼還有一種方式是修改 sqlall 的輸出,手工在 資料庫中執行命令,命令如下:
$ ./manage.py sqlall sales | ./manage.py dbshell
使用其他管理命令
其他操作資料庫的 django-admin.py 命令與 syncdb 類似,他們一次只 操作一個資料庫,使用 --database 來控制使用哪個資料庫。
自動資料庫路由
使用多資料庫最簡單的方法是設置一個資料庫路由方案。預設的路由方案確保對象 「緊貼」其原本的資料庫(例如:一個對象從哪個資料庫取得,就保存回哪個資料庫)。 預設的路由方案還確保如果一個資料庫沒有指定,所有的查詢都會作用於 預設 數據 庫。
你不必為啟動預設路由方案作任何事,因為它是「開箱即用」的。但是,如果你要執行 一些更有趣的資料庫分配行為的話,你可以定義並安裝你自己的資料庫路由。
資料庫路由
一個資料庫路由是一個類,這個類最多有四個方法:
db_for_read(model, **hints)
建議 model 對象寫操作時使用的資料庫。
如果一個資料庫操作可以提供對選擇資料庫有用的附加信息,那麼可以通過 hints 字典提供。詳見 下文 。
如果沒有建議則返回 None 。
db_for_write(model, **hints)
建議 model 對象讀操作時使用的資料庫。
如果一個資料庫操作可以提供對選擇資料庫有用的附加信息,那麼可以通過 hints 字典提供。詳見 下文 。
如果沒有建議則返回 None 。
allow_relation(obj1, obj2, **hints)
當 obj1 和 obj2 之間允許有關系時返回 True ,不允許時返回 False ,或者沒有 意見時返回 None 。這是一個純粹的驗證操作,用於外鍵和多對多操作中,兩個對象 的關系是否被允許。
allow_syncdb(db, model)
決定 model 是否可以和 db 為別名的資料庫同步。如果可以返回 True , 如果不可以返回 False ,或者沒有意見時返回 None 。這個方法用於決定一個給定 資料庫的模型是否可用。
一個路由不必提供 所有 這些方法,可以省略其中一個或多個。如果其中一個方法被 省略了,那麼 Django 會在執行相關檢查時跳過相應路由。
提示參數
資料庫路由接收的「提示」參數可用於決定哪個資料庫應當接收一個給定的請求。
目前,唯一可以提供的提示參數是 實例 ,即一個與讀寫操作相關的對象的實例。 可以是一個已保存的對象的實例,也可以是一個多對多關系中添加的實例。在某些情況下, 也可能沒有對象的實例可以提供。路由會檢查提示實例是否存在,並相應地決定是否改變 路由行為。
使用路由
資料庫路由使用 DATABASE_ROUTERS 設置來安裝。這個設置定義一個類名稱 列表,每個類定義一個用於主路由 (django.db.router) 的路由。
主路由用於 Django 分配資料庫操作。當一個查詢想要知道使用哪個資料庫時,會提供 一個模型和一個提示(如果有的話),並調用主路由。
Django 就會按次序嘗試每個路由,
直到找到合適的路由建議。如果找不到路由建議就會嘗試實例提示的當前的 _state.db 。如果沒有提供路由提示,或者實例沒有當前資料庫狀態,那麼
主路由會 分配 預設 資料庫。
一個例子
僅用於示例目的!
這個例子僅用於展示路由如何改變資料庫的使用。本例有意忽略了一些復雜的東西以 便於更好的展示路由是如何工作的。
如果任何一個 myapp 中的模型包含與 另一個 資料庫中模型的關系時,本例 是無效的。參見 跨資料庫關系一節中介紹 的 Django 引用完整性問題。
本例的主/從配置也是有缺陷的:它沒有處理復制延時(比如因為把寫操作傳遞給從 資料庫耗費時間而產生的查詢不一致),也沒有考慮與資料庫使用策略的交互作用。
那麼,這個例子有什麼用呢?本例僅用於演示一個 myapp 存在於 other 資料庫, 所有其他模型之間是主/從關系,且存在於 master 、 slave1 和 slave2 資料庫。本例使用了兩個路由:
class MyAppRouter(object): """ 一個控制 myapp 應用中模型的 所有資料庫操作的路由 """ def db_for_read(self, model, **hints): "myapp 應用中模型的操作指向 'other'" if model._meta.app_label == 'myapp': return 'other' return None def db_for_write(self, model, **hints): "myapp 應用中模型的操作指向 'other'" if model._meta.app_label == 'myapp': return 'other' return None def allow_relation(self, obj1, obj2, **hints): " 如果包含 myapp 應用中的模型則允許所有關系 " if obj1._meta.app_label == 'myapp' or obj2._meta.app_label == 'myapp': return True return None def allow_syncdb(self, db, model): " 確保 myapp 應用只存在於 'other' 資料庫 " if db == 'other': return model._meta.app_label == 'myapp' elif model._meta.app_label == 'myapp': return False return None class MasterSlaveRouter(object): """ 一個設置簡單主/從定義 的路由 """ def db_for_read(self, model, **hints): " 所有讀操作指向一個隨機的從資料庫 " return random.choice(['slave1','slave2']) def db_for_write(self, model, **hints): " 所有寫操作指向主資料庫 " return 'master' def allow_relation(self, obj1, obj2, **hints): " 允許資料庫池中的兩個對象間的任何關系 " db_list = ('master','slave1','slave2') if obj1._state.db in db_list and obj2._state.db in db_list: return True return None def allow_syncdb(self, db, model): " 顯示地放置所有資料庫中的模型 " return True
然後在你的設置文件增加如下內容(把 path.to. 替換為你定義路由的模型的路徑 ):
DATABASE_ROUTERS = ['path.to.MyAppRouter', 'path.to.MasterSlaveRouter']
這個設置中,路由的順序是很重要的,因為查詢時是按這個設置中的順序依次查詢的。上 例中, MyAppRouter 先於MasterSlaveRouter ,因此, myapp 中的模型就 優先於其他模型。如果 DATABASE_ROUTERS 設置中兩個路由的順序變換了, 那麼 MasterSlaveRouter.allow_syncdb() 會優先執行。因為 MasterSlaveRouter 是 包羅萬象的,這樣就會導致所有模型可以使用所有資料庫。
設置好之後讓我們來運行一些代碼:
>>> # 從 'credentials' 資料庫獲得數據 >>> fred = User.objects.get(username='fred') >>> fred.first_name = 'Frederick' >>> # 保存到 'credentials' 資料庫 >>> fred.save() >>> # 隨機從從資料庫獲得數據 >>> dna = Person.objects.get(name='Douglas Adams') >>> # 新對象創建時還沒有分配資料庫 >>> mh = Book(title='Mostly Harmless') >>> # 這個賦值會向路由發出請求,並把 mh 的資料庫設置為與 author 對象同樣的 >>> # 資料庫 >>> mh.author = dna >>> # 這會強制 'mh' 實例使用主資料庫... >>> mh.save() >>> # ... 但如果我們重新獲取對象,就會從從資料庫中獲取 >>> mh = Book.objects.get(title='Mostly Harmless')
手動選擇資料庫
Django 也提供一個可以讓你通過代碼完全控制資料庫使用的 API 。手動定義資料庫分配 優先於路由。
為一個 查詢集 手動選擇一個資料庫
你可以在 查詢集 「鏈」中的任何點為 查詢集 選擇資料庫。我們通過在 查詢集 上調用 using() 來得到使用指定資料庫的另一個 查詢集 。
using() 使用一個參數:你想要運行查詢的資料庫的別名。例如:
>>> # 這會運行在「預設」資料庫上。 >>> Author.objects.all() >>> # 這同樣會運行在「預設」資料庫上。 >>> Author.objects.using('default').all() >>> # 這會運行在「 other 」資料庫上。 >>> Author.objects.using('other').all()
為 save() 選擇一個資料庫
在使用 Model.save() 時加上 using 關鍵字可以指定保存到哪個資料庫。
例如,要把一個對象保存到 legacy_users 資料庫應該這樣做:
>>> my_object.save(using='legacy_users')
如果你不定義 using ,那麼 save() 方法會根據路由分配把數據保存到預設 資料庫中。
把一個對象從一個資料庫移動到另一個資料庫
當你已經在一個資料庫中保存了一個對象後,你可能會使用 save(using=...) 把這個 對象移動到另一個資料庫中。但是,如果你沒有使用恰當的方法,那麼可能會出現意想不 到的後果。
假設有如下的例子:
>>> p = Person(name='Fred') >>> p.save(using='first') # (第一句) >>> p.save(using='second') # (第二名)
在第一名中,一個新的 Person 對象被保存到 first 資料庫中。這時, p 還沒有一個主鍵,因此 Django 執行了一個INSERT SQL 語句。這樣就會創建一個 主鍵,並將這個主鍵分配給 p 。
在第二句中,因為 p 已經有了一個主鍵,所以 Django 在保存對象時會嘗試在新的 資料庫中使用這個主鍵。如果 second資料庫中沒有使用這個主鍵,那就不會有問題, 該對象會復制到新資料庫。
然而,如果 p 的主鍵在 second 資料庫中已經使用過了,那麼 second 使用 這個主鍵的已存在的對象將會被 p 覆蓋。
有兩種方法可以避免上述情況的發生。第一,你可以清除實例的主鍵。如果一個對象沒有 主主鍵,那麼 Django 會把它看作一個新對象,在保存到 second 資料庫中時就不會 帶來數據的損失:
>>> p = Person(name='Fred') >>> p.save(using='first') >>> p.pk = None # 清除主鍵。 >>> p.save(using='second') # 寫入一個全新的對象。
第二種方法是在 save() 方法中使用 force_insert 選項來保證 Django 執行 一個 INSERT SQL:
>>> p = Person(name='Fred') >>> p.save(using='first') >>> p.save(using='second', force_insert=True)
這樣可以保證名為 Fred 的人員在兩個資料庫中使用相同的主鍵。如果在保存到 second 資料庫時主鍵已被佔用,會拋出一個錯誤。
選擇一個要刪除數據的資料庫
預設情況下,一個現存對象從哪個資料庫得到,刪除這個對象也會在這個資料庫中進行:
>>> u = User.objects.using('legacy_users').get(username='fred') >>> u.delete() # 會從 `legacy_users` 資料庫中刪除
通過向 Model.delete() 方法傳遞 using 關鍵字參數可以定義在哪個資料庫中刪除 數據。 using 的用法與 save() 方法中使用這個參數類似。
例如,假設我們要把一個用戶從 legacy_users 資料庫移動到 new_users 資料庫 可以使用如下命令:
>>> user_obj.save(using='new_users') >>> user_obj.delete(using='legacy_users')
多資料庫情況下使用管理器
在管理器上使用 db_manager() ,可以讓管理器訪問一個非預設資料庫。
例如,假設你有一個操作資料庫的自定義管理器 User.objects.create_user() 。
因為 create_user() 是一個管理器方法,不是一個 查詢集 ,所以你不能
用 User.objects.using('new_users').create_user() 。( create_user() 方法
只能用於 User.objects 管理器,而不能用於,管理器衍生出的 查詢集 。) 解決方法是使用 db_manager() ,就象下面這樣:
User.objects.db_manager('new_users').create_user(...)
db_manager() 返回的是綁定到你指定的資料庫的管理器的一個副本。
多資料庫情況下使用 get_query_set()
如果你在管理器中重載了 get_query_set() ,請確保在其父類中也調用了相同的方法 (使用 super() )或者正確處理管理器中的 _db 屬性(一個包含要使用的資料庫 名稱的字元串)。
例如,如果你要從 get_query_set 方法返回一個自定義 查詢集 類,那麼你可以 這樣做:
class MyManager(models.Manager): def get_query_set(self): qs = CustomQuerySet(self.model) if self._db is not None: qs = qs.using(self._db) return qs
在 Django 管理介面中使用多資料庫
Django 的管理介面沒有明顯支持多資料庫。如果想要支持的話你必須寫自定義 ModelAdmin 。
㈤ django怎麼使用本機mysql資料庫
step 1:
修改你的django project目錄下的settings.py 文件至如下所示:
其中,'NAME' 對應的 『db_name' 是你事先使用mysql
的命令行提示符創建的資料庫名稱。注意:在django使用資料庫之前,你必須先創建出資料庫,否則會報錯。'USER'對應的'username'
還有 'PASSWORD' 對應的『passwd'
就是你在mysql中創建的用戶名和密碼。如果你有多個的話,隨便填一個就好。'HOST'和'PORT'默認都可以不填。
題外話: 使用用戶名和密碼登錄mysql的方法:
首先,你需要進入 mysql/bin的目錄下,也可以在.bash_profile中設置環境變數:
PATH=/usr/local/bin:/usr/bin:/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/Cellar/mysql/5.6.22/bin/
再在prompt輸入 mysql -u username -p, 回車後再輸入 passwd即可
step 2:
然後,在manage.py路徑中使用python manage.py syncdb 試試,結果會提示你錯誤找不到 MySQLdb 這個mole, 為什麼呢, 因為 python manage.py syncdb 命令是這樣工作的:
1. 在project目錄的settings.py的INSTALLED_APPS元組中找到可能需要更新的APP。
2. 找到每一個APP目錄中的models.py (關系定義文件),並針對變化在資料庫中進行更新。
說了這么多,前面那個錯誤 找不到 mole MySQLdb 是什麼意思啊 ?
先給個圖,再解釋:
因為在models.py中定義關系使用的是python,而真正在資料庫中操作形成model當然一定要用sql語句,所以必須要有一些功能模塊
來把python語句轉化成sql語句。如果你使用sqlite的話,由於sqlite和轉化模塊都已經由python內置了,所以直接使用不會發生錯
誤。但是 」mysql語句的轉化模塊「 就需要你手動載入了,這些模塊放在 MySQL-python 中。
我是使用pip 安裝的:
安裝了之後,再使用 python manage.py syncdb就OK啦。
我使用的系統是 OS X,下面是 mysql 默認的安裝路徑
/usr/local/Cellar/mysql/5.6.22/
如果你想知道你的資料庫文件是放在哪裡的,你可以查看mysql_config文件中的ldata變數,這個變數的值就是 默認的資料庫文件夾存儲的路徑。 我的系統中,mysql_config的完整路徑是 :
/usr/local/Cellar/mysql/5.6.22/bin/mysql_config
㈥ 如何處理django的資料庫連接池
由於創建連接的代價是很高的, 我們每次訪問資料庫都重新創建連接的話是非常消耗性的.
我們可以再程序啟動的時候先創建出一些連接, 放在一個集合中, 訪問資料庫的時候從集合中獲取, 使用結束再放回集合中.
這樣做只是在程序啟動的時候消耗性能去創建連接, 每次訪問資料庫的時候都是從內存中獲取連接, 可以大大提升效率.
注意事項:
由於池中增刪非常頻繁, 使用集合LinkedList效率較高
集合中所有連接都被佔用時創建新連接, 但需要注意連接總數
使用組合模式/動態代理處理釋放連接的方法, 當運行close方法時, 將連接放回池中
關於資料庫連接池:
資料庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤為突出。對資料庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標。資料庫連接池正是針對這個問題提出來的。
資料庫連接池負責分配、管理和釋放資料庫連接,它允許應用程序重復使用一個現有的資料庫連接,而再不是重新建立一個;釋放空閑時間超過最大空閑時間的資料庫連接來避免因為沒有釋放資料庫連接而引起的資料庫連接遺漏。這項技術能明顯提高對資料庫操作的性能。
資料庫連接池在初始化時將創建一定數量的資料庫連接放到連接池中,這些資料庫連接的數量是由最小資料庫連接數來設定的。無論這些資料庫連接是否被 使用,連接池都將一直保證至少擁有這么多的連接數量。連接池的最大資料庫連接數量限定了這個連接池能佔有的最大連接數,當應用程序向連接池請求的連接數超 過最大連接數量時,這些請求將被加入到等待隊列中。
資料庫連接池的最小連接數和最大連接數的設置要考慮到下列幾個因素:
1) 最小連接數是連接池一直保持的資料庫連接,所以如果應用程序對資料庫連接的使用量不大,將會有大量的資料庫連接資源被浪費;
2) 最大連接數是連接池能申請的最大連接數,如果資料庫連接請求超過此數,後面的資料庫連接請求將被加入到等待隊列中,這會影響之後的資料庫操作。
3) 如果最小連接數與最大連接數相差太大,那麼最先的連接請求將會獲利,之後超過最小連接數量的連接請求等價於建立一個新的資料庫連接。不過,這些大於最小連接數的資料庫連接在使用完不會馬上被釋放,它將被放到連接池中等待重復使用或是空閑超時後被釋放。
J2EE伺服器啟動時會建立一定數量的池連接,並一直維持不少於此數目的池連接。
調用:客戶端程序需要連接時,池驅動程序會返回一個未使用的池連接並將其表記為 忙。如果當前沒有空閑連接,池驅動程序就新建一定數量的連接,新建連接的數量有配置參數決定。
釋放:當使用的池連接調用完成後,池驅動程序將此連接表記為空閑, 其他調用就可以使用這個連接
㈦ 如何使用django的資料庫鏈接
可以啊。不過要手工寫了。在配置里將資料庫路徑放進去。然後在mole里,自己選擇相應的庫與相應的model做關聯。
此外還可以指定表格中的欄位名。另外如果上面的方法不好用,你也可以自己直接連接資料庫,自己管理。
django的資料庫連接是沒有連接池的。 每次訪問都連接一次,效率低。不過你也可以用同樣的原理 ,用mysqldb之類的庫,自己建立資料庫連接。
㈧ django 資料庫使用
在django程序外部使用django models,我給你端示例代碼你看看:
fromdjango.core.managementimportsetup_environ
importQB.settings
setup_environ(QB.settings)
fromrecharge.modelsimportOrder,FailGetOrder
QB是我的project名稱,recharge是我的app名稱
㈨ django資料庫查詢操作
1.get(**kwargs)
解釋:返回與篩選條件相匹配的Model對象,返回結果有且只有一個。
說明:如果符合條件的對象多於一個拋出MultipleObjectsReturned異常,如果沒有找到拋出DoesNotExist異常
語法:ModelName.objects.get(itemName=itemNameValue)
例子:Author.objects.get(id=1)