<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Django使用多數據庫的方法

        來源:懂視網 責編:小采 時間:2020-11-27 22:30:53
        文檔

        Django使用多數據庫的方法

        Django使用多數據庫的方法:有些項目可能涉及到使用多個數據庫的情況,方法很簡單。 1.在settings中設定DATABASE 比如要使用兩個數據庫: DATABASES = { 'default': { 'NAME': 'app_data', 'ENGINE': 'django.db.backends.postgresql', 'USER'
        推薦度:
        導讀Django使用多數據庫的方法:有些項目可能涉及到使用多個數據庫的情況,方法很簡單。 1.在settings中設定DATABASE 比如要使用兩個數據庫: DATABASES = { 'default': { 'NAME': 'app_data', 'ENGINE': 'django.db.backends.postgresql', 'USER'

        有些項目可能涉及到使用多個數據庫的情況,方法很簡單。

        1.在settings中設定DATABASE

        比如要使用兩個數據庫:

        DATABASES = {
         'default': {
         'NAME': 'app_data',
         'ENGINE': 'django.db.backends.postgresql',
         'USER': 'postgres_user',
         'PASSWORD': 's3krit'
         },
         'users': {
         'NAME': 'user_data',
         'ENGINE': 'django.db.backends.mysql',
         'USER': 'mysql_user',
         'PASSWORD': 'priv4te'
         }
        }

        這樣就確定了2個數據庫,別名一個為default,一個為user。數據庫的別名可以任意確定。

        default的別名比較特殊,一個Model在路由中沒有特別選擇時,默認使用default數據庫。

        當然,default也可以設置為空:

        DATABASES = {
         'default': {},
         'users': {
         'NAME': 'user_data',
         'ENGINE': 'django.db.backends.mysql',
         'USER': 'mysql_user',
         'PASSWORD': 'superS3cret'
         },
         'customers': {
         'NAME': 'customer_data',
         'ENGINE': 'django.db.backends.mysql',
         'USER': 'mysql_cust',
         'PASSWORD': 'veryPriv@ate'
         }
        }

        這樣,因為沒有了默認的數據庫,就需要為所有的Model,包括使用的第三方庫中的Model做好數據庫路由選擇。

        2.為需要做出數據庫選擇的Model規定app_label

        class MyUser(models.Model):
         ...
         class Meta:
         app_label = 'users'

        3.寫Database Routers

        Database Router用來確定一個Model使用哪一個數據庫,主要定義以下四個方法:

        db_for_read(model, **hints)

        規定model使用哪一個數據庫讀取。

        db_for_write(model, **hints)

        規定model使用哪一個數據庫寫入。

        allow_relation(obj1, obj2, **hints)

        確定obj1和obj2之間是否可以產生關聯, 主要用于foreign key和 many to many操作。

        allow_migrate(db, app_label, model_name=None, **hints)

        確定migrate操作是否可以在別名為db的數據庫上運行。

        一個完整的例子:

        數據庫設定:

        DATABASES = {
         'default': {},
         'auth_db': {
         'NAME': 'auth_db',
         'ENGINE': 'django.db.backends.mysql',
         'USER': 'mysql_user',
         'PASSWORD': 'swordfish',
         },
         'primary': {
         'NAME': 'primary',
         'ENGINE': 'django.db.backends.mysql',
         'USER': 'mysql_user',
         'PASSWORD': 'spam',
         },
         'replica1': {
         'NAME': 'replica1',
         'ENGINE': 'django.db.backends.mysql',
         'USER': 'mysql_user',
         'PASSWORD': 'eggs',
         },
         'replica2': {
         'NAME': 'replica2',
         'ENGINE': 'django.db.backends.mysql',
         'USER': 'mysql_user',
         'PASSWORD': 'bacon',
         },
        }

        如果想要達到如下效果:

        app_label為auth的Model讀寫都在auth_db中完成,其余的Model寫入在primary中完成,讀取隨機在replica1和replica2中完成。

        auth:

        class AuthRouter(object):
         """
         A router to control all database operations on models in the
         auth application.
         """
         def db_for_read(self, model, **hints):
         """
         Attempts to read auth models go to auth_db.
         """
         if model._meta.app_label == 'auth':
         return 'auth_db'
         return None
         def db_for_write(self, model, **hints):
         """
         Attempts to write auth models go to auth_db.
         """
         if model._meta.app_label == 'auth':
         return 'auth_db'
         return None
         def allow_relation(self, obj1, obj2, **hints):
         """
         Allow relations if a model in the auth app is involved.
         """
         if obj1._meta.app_label == 'auth' or \
         obj2._meta.app_label == 'auth':
         return True
         return None
         def allow_migrate(self, db, app_label, model_name=None, **hints):
         """
         Make sure the auth app only appears in the 'auth_db'
         database.
         """
         if app_label == 'auth':
         return db == 'auth_db'
         return None

        這樣app_label為auth的Model讀寫都在auth_db中完成,允許有關聯,migrate只在auth_db數據庫中可以運行。

        其余的:

        import random
        class PrimaryReplicaRouter(object):
         def db_for_read(self, model, **hints):
         """
         Reads go to a randomly-chosen replica.
         """
         return random.choice(['replica1', 'replica2'])
         def db_for_write(self, model, **hints):
         """
         Writes always go to primary.
         """
         return 'primary'
         def allow_relation(self, obj1, obj2, **hints):
         """
         Relations between objects are allowed if both objects are
         in the primary/replica pool.
         """
         db_list = ('primary', 'replica1', 'replica2')
         if obj1._state.db in db_list and obj2._state.db in db_list:
         return True
         return None
         def allow_migrate(self, db, app_label, model_name=None, **hints):
         """
         All non-auth models end up in this pool.
         """
         return True

        這樣讀取在隨機在replica1和replica2中完成,寫入使用primary。

        最后在settings中設定:

        DATABASE_ROUTERS = ['path.to.AuthRouter', 'path.to.PrimaryReplicaRouter']

        就可以了。

        進行migrate操作時:

        $ ./manage.py migrate
        $ ./manage.py migrate --database=users

        migrate操作默認對default數據庫進行操作,要對其它數據庫進行操作,可以使用--database選項,后面為數據庫的別名。

        與此相應的,dbshell,dumpdata,loaddata命令都有--database選項。

        也可以手動的選擇路由:

        查詢:

        >>> # This will run on the 'default' database.
        >>> Author.objects.all()
        >>> # So will this.
        >>> Author.objects.using('default').all() 
        >>> # This will run on the 'other' database.
        >>> Author.objects.using('other').all()

        保存:

        >>> my_object.save(using='legacy_users')

        移動:

        >>> p = Person(name='Fred')
        >>> p.save(using='first') # (statement 1)
        >>> p.save(using='second') # (statement 2)

        以上的代碼會產生問題,當p在first數據庫中第一次保存時,會默認生成一個主鍵,這樣使用second數據庫保存時,p已經有了主鍵,這個主鍵如果未被使用不會產生問題,但如果先前被使用了,就會覆蓋原先的數據。

        有兩個解決方法;

        1.保存前清除主鍵:

        >>> p = Person(name='Fred')
        >>> p.save(using='first')
        >>> p.pk = None # Clear the primary key.
        >>> p.save(using='second') # Write a completely new object.

        2.使用force_insert

        >>> p = Person(name='Fred')
        >>> p.save(using='first')
        >>> p.save(using='second', force_insert=True)

        刪除:

        從哪個數據庫取得的對象,從哪刪除

        >>> u = User.objects.using('legacy_users').get(username='fred')
        >>> u.delete() # will delete from the `legacy_users` database

        如果想把一個對象從legacy_users數據庫轉移到new_users數據庫:

        >>> user_obj.save(using='new_users')
        >>> user_obj.delete(using='legacy_users')

        總結

        以上所述是小編給大家介紹的Django使用多數據庫的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Django使用多數據庫的方法

        Django使用多數據庫的方法:有些項目可能涉及到使用多個數據庫的情況,方法很簡單。 1.在settings中設定DATABASE 比如要使用兩個數據庫: DATABASES = { 'default': { 'NAME': 'app_data', 'ENGINE': 'django.db.backends.postgresql', 'USER'
        推薦度:
        標簽: 連接 方法 使用的
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 抽搐一进一出gif免费视频| GOGOGO高清免费看韩国| 桃子视频在线观看高清免费视频| 亚洲毛片av日韩av无码| 黄色三级三级三级免费看| 四只虎免费永久观看| 鲁啊鲁在线视频免费播放| 亚洲AV无码乱码在线观看性色扶| 亚洲国产成人精品无码区在线观看 | 污污免费在线观看| 亚洲国产精品尤物YW在线观看| 羞羞视频免费网站日本| 亚洲熟妇中文字幕五十中出| 在线观看免费无码专区| 亚洲麻豆精品果冻传媒| 巨胸喷奶水视频www免费视频| 国产亚洲成AV人片在线观黄桃 | 搡女人真爽免费视频大全| 亚洲精品无AMM毛片| 亚洲精品第一国产综合境外资源 | 亚洲精品美女久久久久99| 一区二区三区福利视频免费观看| 亚洲男人天堂影院| 女人被弄到高潮的免费视频 | 色费女人18女人毛片免费视频| www.亚洲色图| 亚洲精品无码久久久久YW| 免费在线观看中文字幕| 99久久免费国产特黄| 相泽亚洲一区中文字幕| 久久国产精品2020免费m3u8| 久久亚洲最大成人网4438| 亚洲Av无码乱码在线观看性色| 免费国产黄网站在线观看视频| 亚洲精品GV天堂无码男同| 国产亚洲欧洲Aⅴ综合一区| 67194熟妇在线永久免费观看 | 69视频免费在线观看| 美女视频黄a视频全免费网站色| 亚洲成AV人片在线观看无码 | 今天免费中文字幕视频|