django 多mysql数据库_Django与多个数据库交互

定义数据库

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

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

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

AAffA0nNPuCLAAAAAElFTkSuQmCCDATABASES = {    '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 数据库故意空着:

AAffA0nNPuCLAAAAAElFTkSuQmCCDATABASES = {    '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'

}

}

同步数据库

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

手动选择数据库

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

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

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

若要将数据保存到指定的数据库;例如,若要将对象保存到 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发出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文档:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值