发布网友 发布时间:2024-09-26 08:14
共1个回答
热心网友 时间:2024-10-04 11:02
导读:本篇文章首席CTO笔记来给大家介绍有关django怎么删除数据库的相关内容,希望对大家有所帮助,一起来看看吧。
如何在django中使用多个数据库使用多个数据库
NewinDjango1.2:Please,seethereleasenotes
大多数其他文档都假设使用单一数据库,本文主要讨论如何在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.pysyncdb
$./manage.pysyncdb--database=users
如果你不是同步所有的程序到同一个数据库中,你可定义一个数据库路由来为指定的模型实施特定的控制策略。
如果你要精细地控制同步,那么还有一种方式是修改sqlall的输出,手工在数据库中执行命令,命令如下:
$./manage.pysqlallsales|./manage.pydbshell
使用其他管理命令
其他操作数据库的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数据库。本例使用了两个路由:
classMyAppRouter(object):"""一个控制myapp应用中模型的所有数据库操作的路由"""defdb_for_read(self,model,**hints):"myapp应用中模型的操作指向'other'"ifmodel._meta.app_label=='myapp':return'other'returnNonedefdb_for_write(self,model,**hints):"myapp应用中模型的操作指向'other'"ifmodel._meta.app_label=='myapp':return'other'returnNonedefallow_relation(self,obj1,obj2,**hints):"如果包含myapp应用中的模型则允许所有关系"ifobj1._meta.app_label=='myapp'orobj2._meta.app_label=='myapp':returnTruereturnNonedefallow_syncdb(self,db,model):"确保myapp应用只存在于'other'数据库"ifdb=='other':returnmodel._meta.app_label=='myapp'elifmodel._meta.app_label=='myapp':returnFalsereturnNoneclassMasterSlaveRouter(object):"""一个设置简单主/从定义的路由"""defdb_for_read(self,model,**hints):"所有读操作指向一个随机的从数据库"returnrandom.choice(['slave1','slave2'])defdb_for_write(self,model,**hints):"所有写操作指向主数据库"return'master'defallow_relation(self,obj1,obj2,**hints):"允许数据库池中的两个对象间的任何关系"db_list=('master','slave1','slave2')ifobj1._state.dbindb_listandobj2._state.dbindb_list:returnTruereturnNonedefallow_syncdb(self,db,model):"显示地放置所有数据库中的模型"returnTrue
然后在你的设置文件增加如下内容(把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='DouglasAdams')#新对象创建时还没有分配数据库mh=Book(title='MostlyHarmless')#这个赋值会向路由发出请求,并把mh的数据库设置为与author对象同样的#数据库mh.author=dna#这会强制'mh'实例使用主数据库...mh.save()#...但如果我们重新获取对象,就会从从数据库中获取mh=Book.objects.get(title='MostlyHarmless')
手动选择数据库
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执行了一个INSERTSQL语句。这样就会创建一个主键,并将这个主键分配给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执行一个INSERTSQL:
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方法返回一个自定义查询集类,那么你可以这样做:
classMyManager(models.Manager):defget_query_set(self):qs=CustomQuerySet(self.model)ifself._dbisnotNone:qs=qs.using(self._db)returnqs
在Django管理接口中使用多数据库
Django的管理接口没有明显支持多数据库。如果想要支持的话你必须写自定义ModelAdmin。
如果要支持多数据库,那么ModelAdmin对象有五个方法要自定义:
classMultiDBModelAdmin(admin.ModelAdmin):#为方便起见定义一个数据库名称常量。using='other'defsave_model(self,request,obj,form,change):#让Django保存对象到'other'数据库。obj.save(using=self.using)defdelete_model(self,request,obj):#让Django从'other'数据库中删除对象。obj.delete(using=self.using)defqueryset(self,request):#让Django在'other'数据库中搜索对象。returnsuper(MultiDBModelAdmin,self).queryset(request).using(self.using)defformfield_for_foreignkey(self,db_field,request=None,**kwargs):#让Django基于'other'数据库生成外键控件。returnsuper(MultiDBModelAdmin,self).formfield_for_foreignkey(db_field,request=request,using=self.using,**kwargs)defformfield_for_manytomany(self,db_field,request=None,**kwargs):#让Django基于'other'数据库生成多对多关系控件。returnsuper(MultiDBModelAdmin,self).formfield_for_manytomany(db_field,request=request,using=self.using,**kwargs)
django用的mysql数据库,删除数据时索引也就随之删除了,索引就不规律了,如和能让删除数据时索引不变?
这个id依然是规律的。
比如你原来有1、2、3、4、5、6、7、8、9个id号码,结果删掉了3和7这两个id。接下来你新建的id会依然自动的从10开始,而不是你想象中认为的将3和7补齐。这是Django的默认规则。除非你手动指定id,前提是不产生冲突。
一般情况,不要去人为控制id这个自动字段,而是自己设计一个专门的字段做这方面的考虑,进行排序、过滤、索引等等方面的工作。
安利一个Django学习网站Django权威教程
pycharamdjango创建项目删除File-NewProject-Projecttype选择djangoproject.如果解决了您的问题请采纳!如果未解决请继续追问!
Django测试数据库已存在怎么办?数据库创建前做个判断
ifnotexistsdatabase
createdatabase
Django的多数据库问题,怎么解决选择开始菜单中→程序→【ManagementSQLServer2008】→【SQLServerManagementStudio】命令,打开【SQLServerManagementStudio】窗口,并使用Windows或SQLServer身份验证建立连接。
在【对象资源管理器】窗口中展开服务器,然后选择【数据库】节点
右键单击【数据库】节点,从弹出来的快捷菜单中选择【新建数据库】命令。
执行上述操作后,会弹出【新建数据库】对话框。在对话框、左侧有3个选项,分别是【常规】、【选项】和【文件组】。完成这三个选项中的设置会后,就完成了数据库的创建工作,
在【数据库名称】文本框中输入要新建数据库的名称。例如,这里以“新建的数据库”。
在【所有者】文本框中输入新建数据库的所有者,如sa。根据数据库的使用情况,选择启用或者禁用【使用全文索引】复选框。
在【数据库文件】列表中包括两行,一行是数据库文件,而另一行是日记文件。通过单击下面的【添加】、【删除】按钮添加或删除数据库文件。
切换到【选项页】、在这里可以设置数据库的排序规则、恢复模式、兼容级别和其他属性。
切换到【文件组】页,在这里可以添加或删除文件组。
完成以上操作后,单击【确定】按钮关闭【新建数据库】对话框。至此“新建的数据”数据库创建成功。新建的数据库可以再【对象资源管理器】窗口看到。
datagrip怎么回滚1.先删除models中定义的表
2.删除makemigrations生成的文件system/migrations/0007_auto_20201027_1105.py
3.将数据库中django_migrations表中最新操作之后生成的表记录删除
deletefromdjango_migrationswhereapplied'2020-10-27';
4.再次执行makemigrations和migrate
第二种情况:删除刚刚新增的字段同时清除新增字段的记录:
1.先删除models中定义的字段
2.执行makemigrations,生成删除字段的迁移文件,然后执行migrate迁移将数据库中的字段删除
3.将数据库中django_migrations表中新增与删除字段的两次操作记录删除
4.将migrations目录下的新增与删除字段的迁移文件删除
结语:以上就是首席CTO笔记为大家介绍的关于django怎么删除数据库的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。
热心网友 时间:2024-10-04 11:06
导读:本篇文章首席CTO笔记来给大家介绍有关django怎么删除数据库的相关内容,希望对大家有所帮助,一起来看看吧。
如何在django中使用多个数据库使用多个数据库
NewinDjango1.2:Please,seethereleasenotes
大多数其他文档都假设使用单一数据库,本文主要讨论如何在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.pysyncdb
$./manage.pysyncdb--database=users
如果你不是同步所有的程序到同一个数据库中,你可定义一个数据库路由来为指定的模型实施特定的控制策略。
如果你要精细地控制同步,那么还有一种方式是修改sqlall的输出,手工在数据库中执行命令,命令如下:
$./manage.pysqlallsales|./manage.pydbshell
使用其他管理命令
其他操作数据库的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数据库。本例使用了两个路由:
classMyAppRouter(object):"""一个控制myapp应用中模型的所有数据库操作的路由"""defdb_for_read(self,model,**hints):"myapp应用中模型的操作指向'other'"ifmodel._meta.app_label=='myapp':return'other'returnNonedefdb_for_write(self,model,**hints):"myapp应用中模型的操作指向'other'"ifmodel._meta.app_label=='myapp':return'other'returnNonedefallow_relation(self,obj1,obj2,**hints):"如果包含myapp应用中的模型则允许所有关系"ifobj1._meta.app_label=='myapp'orobj2._meta.app_label=='myapp':returnTruereturnNonedefallow_syncdb(self,db,model):"确保myapp应用只存在于'other'数据库"ifdb=='other':returnmodel._meta.app_label=='myapp'elifmodel._meta.app_label=='myapp':returnFalsereturnNoneclassMasterSlaveRouter(object):"""一个设置简单主/从定义的路由"""defdb_for_read(self,model,**hints):"所有读操作指向一个随机的从数据库"returnrandom.choice(['slave1','slave2'])defdb_for_write(self,model,**hints):"所有写操作指向主数据库"return'master'defallow_relation(self,obj1,obj2,**hints):"允许数据库池中的两个对象间的任何关系"db_list=('master','slave1','slave2')ifobj1._state.dbindb_listandobj2._state.dbindb_list:returnTruereturnNonedefallow_syncdb(self,db,model):"显示地放置所有数据库中的模型"returnTrue
然后在你的设置文件增加如下内容(把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='DouglasAdams')#新对象创建时还没有分配数据库mh=Book(title='MostlyHarmless')#这个赋值会向路由发出请求,并把mh的数据库设置为与author对象同样的#数据库mh.author=dna#这会强制'mh'实例使用主数据库...mh.save()#...但如果我们重新获取对象,就会从从数据库中获取mh=Book.objects.get(title='MostlyHarmless')
手动选择数据库
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执行了一个INSERTSQL语句。这样就会创建一个主键,并将这个主键分配给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执行一个INSERTSQL:
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方法返回一个自定义查询集类,那么你可以这样做:
classMyManager(models.Manager):defget_query_set(self):qs=CustomQuerySet(self.model)ifself._dbisnotNone:qs=qs.using(self._db)returnqs
在Django管理接口中使用多数据库
Django的管理接口没有明显支持多数据库。如果想要支持的话你必须写自定义ModelAdmin。
如果要支持多数据库,那么ModelAdmin对象有五个方法要自定义:
classMultiDBModelAdmin(admin.ModelAdmin):#为方便起见定义一个数据库名称常量。using='other'defsave_model(self,request,obj,form,change):#让Django保存对象到'other'数据库。obj.save(using=self.using)defdelete_model(self,request,obj):#让Django从'other'数据库中删除对象。obj.delete(using=self.using)defqueryset(self,request):#让Django在'other'数据库中搜索对象。returnsuper(MultiDBModelAdmin,self).queryset(request).using(self.using)defformfield_for_foreignkey(self,db_field,request=None,**kwargs):#让Django基于'other'数据库生成外键控件。returnsuper(MultiDBModelAdmin,self).formfield_for_foreignkey(db_field,request=request,using=self.using,**kwargs)defformfield_for_manytomany(self,db_field,request=None,**kwargs):#让Django基于'other'数据库生成多对多关系控件。returnsuper(MultiDBModelAdmin,self).formfield_for_manytomany(db_field,request=request,using=self.using,**kwargs)
django用的mysql数据库,删除数据时索引也就随之删除了,索引就不规律了,如和能让删除数据时索引不变?
这个id依然是规律的。
比如你原来有1、2、3、4、5、6、7、8、9个id号码,结果删掉了3和7这两个id。接下来你新建的id会依然自动的从10开始,而不是你想象中认为的将3和7补齐。这是Django的默认规则。除非你手动指定id,前提是不产生冲突。
一般情况,不要去人为控制id这个自动字段,而是自己设计一个专门的字段做这方面的考虑,进行排序、过滤、索引等等方面的工作。
安利一个Django学习网站Django权威教程
pycharamdjango创建项目删除File-NewProject-Projecttype选择djangoproject.如果解决了您的问题请采纳!如果未解决请继续追问!
Django测试数据库已存在怎么办?数据库创建前做个判断
ifnotexistsdatabase
createdatabase
Django的多数据库问题,怎么解决选择开始菜单中→程序→【ManagementSQLServer2008】→【SQLServerManagementStudio】命令,打开【SQLServerManagementStudio】窗口,并使用Windows或SQLServer身份验证建立连接。
在【对象资源管理器】窗口中展开服务器,然后选择【数据库】节点
右键单击【数据库】节点,从弹出来的快捷菜单中选择【新建数据库】命令。
执行上述操作后,会弹出【新建数据库】对话框。在对话框、左侧有3个选项,分别是【常规】、【选项】和【文件组】。完成这三个选项中的设置会后,就完成了数据库的创建工作,
在【数据库名称】文本框中输入要新建数据库的名称。例如,这里以“新建的数据库”。
在【所有者】文本框中输入新建数据库的所有者,如sa。根据数据库的使用情况,选择启用或者禁用【使用全文索引】复选框。
在【数据库文件】列表中包括两行,一行是数据库文件,而另一行是日记文件。通过单击下面的【添加】、【删除】按钮添加或删除数据库文件。
切换到【选项页】、在这里可以设置数据库的排序规则、恢复模式、兼容级别和其他属性。
切换到【文件组】页,在这里可以添加或删除文件组。
完成以上操作后,单击【确定】按钮关闭【新建数据库】对话框。至此“新建的数据”数据库创建成功。新建的数据库可以再【对象资源管理器】窗口看到。
datagrip怎么回滚1.先删除models中定义的表
2.删除makemigrations生成的文件system/migrations/0007_auto_20201027_1105.py
3.将数据库中django_migrations表中最新操作之后生成的表记录删除
deletefromdjango_migrationswhereapplied'2020-10-27';
4.再次执行makemigrations和migrate
第二种情况:删除刚刚新增的字段同时清除新增字段的记录:
1.先删除models中定义的字段
2.执行makemigrations,生成删除字段的迁移文件,然后执行migrate迁移将数据库中的字段删除
3.将数据库中django_migrations表中新增与删除字段的两次操作记录删除
4.将migrations目录下的新增与删除字段的迁移文件删除
结语:以上就是首席CTO笔记为大家介绍的关于django怎么删除数据库的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。