继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Django与多个数据库交互

暮色呼如
关注TA
已关注
手记 247
粉丝 86
获赞 309

定义数据库

在Django中使用多个数据库的第一步是告诉Django您将要使用的数据库服务器。

数据库可以有您选择的任何别名。但是,别名 default 有着特殊的意义。Django使用别名为 default 为默认数据库。

例如 settings.py 定义两个数据库,默认 PostgreSQL 数据库和名为 users 的 MySQL 数据库:

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'
    }
}

下面示例 settings.py 定义两个非默认数据库,并将 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'
    }
}

同步数据库

#默认情况下使用 default 数据库, 在 default 数据库为空时不指定数据库会报错python manage.py migrate#要使用特定的数据库, 就需要指定数据库python manage.py migrate --database=users

手动选择数据库

在查询时可以调用 using() 手动选择数据库。

using() 接受一个参数要在其上运行查询的数据库的别名。例如:

>>> # 这将运行 'default'  数据库.>>> Author.objects.all()>>> # 这个和上面也是一样的效果.>>> Author.objects.using('default').all()>>> # 这个就会运行指定的 'other' 数据库.>>> Author.objects.using('other').all()

若要将数据保存到指定的数据库;例如,若要将对象保存到 legacy_users 数据库,您可以使用这个:

my_object.save(using='legacy_users')

如果不指定usingsave()方法将保存到由路由器分配的默认数据库中。

将对象从一个数据库移到另一个数据库

如果您已将实例保存到一个数据库,再使用 save(using=...)作为将实例迁移到新数据库。如果您不采取适当的步骤,这可能会产生一些意想不到的后果。

p = Person(name='Fred')
p.save(using='first')  
p.save(using='second')

Person对象保存到first数据库时,p没有主键,因此Django发出SQLINSERT声明。这将创建一个主键,Django将主键分配给p;

当保存到 'second' 数据库上时,p已经有一个主键值,Django将尝试在新数据库中使用该主键。如果second数据库没有该主键值,那么就不会有任何问题,对象将被复制到新的数据库。但是,如果p的主键second数据库中有对应的数据时,对应数据将被重写。

可以通过两种方式避免这种情况。首先,可以清除实例的主键:

p = Person(name='Fred')
p.save(using='first')
p.pk = None # 清除p的主键值p.save(using='second') # 写入一个没有主键的p实例

或者使用force_insert来save(),以确保Django执行SQLINSERT:

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() #从 'legacy_users' 数据库中删除 'fred'

若要删除指定数据库的数据,传递 using 关键字,和 save() 类似。

例如,如果要把一个 user 从 legacy_users 数据库迁移到 new_users 数据库中,可以使用以下命令:

user_obj.save(using='new_users')
user_obj.delete(using='legacy_users')#删除指定数据库的数据

 

学习自用,欢迎大神评论、指正
详情见Django文档:

https://docs.djangoproject.com/en/2.1/topics/db/multi-db/

原文出处:https://www.cnblogs.com/crazy-zjl/p/10251484.html 

作者:Crazy丶土豆 

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP