Django与多个数据库交互
2019-01-15 07:04:50来源:博客园 阅读 ()
定义数据库
在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')
如果不指定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文档:
https://docs.djangoproject.com/en/2.1/topics/db/multi-db/
原文链接:https://www.cnblogs.com/crazy-zjl/p/10251484.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Django项目中使用qq第三方登录。 2019-08-13
- Django和前端用ajax传输json等数据 2019-08-13
- Django基本知识 2019-08-13
- 链接 Mysql 创建 数据库和创表,增加数据 2019-08-13
- 列表和元组 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash