2024年9月django可连接的数据库(Django教程-02连接初始化数据库)

 更新时间:2024-09-21 08:56:56

  ⑴django可连接的数据库(Django教程-连接初始化数据库

  ⑵Django教程-连接初始化数据库

  ⑶Django教程——安装使用在上面一篇文章里,介绍了安装Django的方法,这里说说连接数据库吧这篇主要介绍踩的坑和解决办法正常连接和初始化数据库的命令是执行这个命令的时候,出现了如下报错经过一段排查,是我配置数据库的时候,多嵌套了一层default,修改为如下即可然后继续执行migrate时,会报如下错误本机环境是mac电脑,按官方教程操作的时候,发现安装mysqlclient的python包会依赖本机安装mysql或者mysql-client,但在装mysql和mysql-client的时候,发现一直报错。后面发现解决办法是,在settings.py文件里,加下如下代码,即改用pymsql连接即可。或者在settings.py同目录的__init__.py里加如上代码也可以然后再执行pythonmanage.pymigrate命令会发现表顺利创建。新增表,不影响原有库的其他表。

  ⑷pycharm下的django怎么连接mysql数据库啊

  ⑸方法/步骤修改setting.py里面的DATABASES元组为DATABASES={’default’:{’ENGINE’:’django.db.backends.mysql’,’NAME’:’books’,#你的数据库名称’USER’:’root’,#你的数据库用户名’PASSWORD’:’’,#你的数据库密码’HOST’:’’,#你的数据库主机,留空默认为localhost’PORT’:’’,#你的数据库端口}}INSTALLED_APPS=(’books’,#你的数据库名称)在mysql里面创建books数据库检查配置是否有语法错误使用pythonmanage.pysqlallbooks显示mysql语法使用pythonmanage.pysyncdb同步模型中的数据库创建成功!

  ⑹如何处理django的数据库连接池

  ⑺由于创建连接的代价是很高的,我们每次访问数据库都重新创建连接的话是非常消耗性的.我们可以再程序启动的时候先创建出一些连接,放在一个集合中,访问数据库的时候从集合中获取,使用结束再放回集合中.这样做只是在程序启动的时候消耗性能去创建连接,每次访问数据库的时候都是从内存中获取连接,可以大大提升效率.注意事项:由于池中增删非常频繁,使用集合LinkedList效率较高集合中所有连接都被占用时创建新连接,但需要注意连接总数使用组合模式/动态代理处理释放连接的方法,当运行close方法时,将连接放回池中关于数据库连接池:数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:)最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;)最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。)如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。JEE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。调用:客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。释放:当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接

  ⑻如何在django中使用多个数据库

  ⑼之后,django支持在项目中使用多个DB.那么到底如何使用呢?.修改settings.pyDATABASES={’default’:{’NAME’:’app_data’,’ENGINE’:’django.db.backends.postgresql_psycopg’,’USER’:’postgres_user’,’PASSWORD’:’skrit’},’users’:{’NAME’:’user_data’,’ENGINE’:’django.db.backends.mysql’,’USER’:’mysql_user’,’PASSWORD’:’privte’}}DATABASE_ROUTERS=.实现自己的DBrouters,这里决定了每个程序使用的是哪个DB。classMyAppRouter(object):“““Aroutertocontrolalldatabaseoperationsonmodelsinthemyappapplication“““defdb_for_read(self,model,**hints):“Pointalloperationsonmyappmodelsto’other’“ifmodel._meta.app_label==’myapp’:return’other’returnNonedefdb_for_write(self,model,**hints):“Pointalloperationsonmyappmodelsto’other’“ifmodel._meta.app_label==’myapp’:return’other’returnNonedefallow_relation(self,obj,obj,**hints):“Allowanyrelationifamodelinmyappisinvolved“ifobj._meta.app_label==’myapp’orobj._meta.app_label==’myapp’:returnTruereturnNonedefallow_syncdb(self,db,model):“Makesurethemyappapponlyappearsonthe’other’db“ifdb==’other’:returnmodel._meta.app_label==’myapp’elifmodel._meta.app_label==’myapp’:returnFalsereturnNone同步数据库的时候,默认会同步到Default数据库,当然也可以通过--database来指定同步哪一个,如下:viewplaincopyprint?《ttclass=“xrefstdstd-djadminoptdocutilsliteral“style=“text-decoration:none;white-space:nowrap;color:rgb(,,);margin-left:px;margin-right:px;border-bottom-width:px;border-bottom-color:rgb(,,);border-bottom-style:dotted;“》$那么程序中如何来选择呢?比如,下面的代码将选择default数据库viewplaincopyprint?《spanstyle=“font-family:monospace;color:#f;“》》》》#Thiswillrunonthe’default’database.》》》Author.objects.all()》》》#Sowillthis.》》》Author.objects.using(’default’).all()《/span》但是下面的代码将选择other数据库viewplaincopyprint?《spanstyle=“font-family:monospace;color:#f;“》》》》#Thiswillrunonthe’other’database.》》》Author.objects.using(’other’).all()《/span》上面是查询的情况,保存的使用也一样,也是通过using来指定,如下:viewplaincopyprint?《spanstyle=“font-family:monospace;color:#f;“》》》》my_object.save(using=’legacy_users’)《/span》删除的时候viewplaincopyprint?《spanstyle=“font-family:monospace;color:#f;“》》》》u=User.objects.using(’legacy_users’).get(username=’fred’)》》》u.delete()#willdeletefromthe`legacy_users`database《/span》

  ⑽关于DJANGO连接数据库和创建模型问题

  ⑾创建数据库选择开始菜单中→程序→【ManagementSQLServer】→【SQLServerManagementStudio】命令,打开【SQLServerManagementStudio】窗口,并使用Windows或SQLServer身份验证建立连接。在【对象资源管理器】窗口中展开服务器,然后选择【数据库】节点右键单击【数据库】节点,从弹出来的快捷菜单中选择【新建数据库】命令。

  ⑿Django如何连接SQLServer

  ⒀给你个直接连的好东西#创建一个数据库连接,host是服务器的ip地址,如果是本机可以用“.“,user是访问用户名,password是密码,database是数据库名,比ADO的连接似乎简单一些conn=pymssql.connect(host=“.“,user=“sa“,password=“twinflag“,database=“bbs“)

  ⒁【Python基础】django默认数据库是什么

  ⒂没有配置的话默认数据库是sqlite,可以在setting里的DATABASES进行数据库配置

  ⒃django开发用什么数据库好

  ⒄使用多个数据库NewinDjango.: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_psycopg’,’USER’:’postgres_user’,’PASSWORD’:’skrit’},’users’:{’NAME’:’user_data’,’ENGINE’:’django.db.backends.mysql’,’USER’:’mysql_user’,’PASSWORD’:’privte’}}如果你尝试访问DATABASES设置中没有定义的数据库,Django会抛出一个django.db.utils.ConnectionDoesNotExist异常。同步你的数据库syncdb管理命令一次只操作一个数据库。缺省情况下,它操作default数据库。但是加上--database参数,你可以让syncdb同步不同的数据库。所以要同步我们例子中的所有数据库的所有模型可以使用如下命令:$如果你不是同步所有的程序到同一个数据库中,你可定义一个数据库路由来为指定的模型实施特定的控制策略。如果你要精细地控制同步,那么还有一种方式是修改sqlall的输出,手工在数据库中执行命令,命令如下:$|使用其他管理命令其他操作数据库的django-admin.py命令与syncdb类似,他们一次只操作一个数据库,使用--database来控制使用哪个数据库。自动数据库路由使用多数据库最简单的方法是设置一个数据库路由方案。缺省的路由方案确保对象“紧贴”其原本的数据库(例如:一个对象从哪个数据库取得,就保存回哪个数据库。缺省的路由方案还确保如果一个数据库没有指定,所有的查询都会作用于缺省数据库。你不必为启动缺省路由方案作任何事,因为它是“开箱即用”的。但是,如果你要执行一些更有趣的数据库分配行为的话,你可以定义并安装你自己的数据库路由。数据库路由一个数据库路由是一个类,这个类最多有四个方法:db_for_read(model,**hints)建议model对象写操作时使用的数据库。如果一个数据库操作可以提供对选择数据库有用的附加信息,那么可以通过hints字典提供。详见下文。如果没有建议则返回None。db_for_write(model,**hints)建议model对象读操作时使用的数据库。如果一个数据库操作可以提供对选择数据库有用的附加信息,那么可以通过hints字典提供。详见下文。如果没有建议则返回None。allow_relation(obj,obj,**hints)当obj和obj之间允许有关系时返回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、slave和slave数据库。本例使用了两个路由: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,obj,obj,**hints):“如果包含myapp应用中的模型则允许所有关系“ifobj._meta.app_label==’myapp’orobj._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()defdb_for_write(self,model,**hints):“所有写操作指向主数据库“return’master’defallow_relation(self,obj,obj,**hints):“允许数据库池中的两个对象间的任何关系“db_list=(’master’,’slave’,’slave’)ifobj._state.dbindb_listandobj._state.dbindb_list:returnTruereturnNonedefallow_syncdb(self,db,model):“显示地放置所有数据库中的模型“returnTrue然后在你的设置文件增加如下内容(把path.to.替换为你定义路由的模型的路径:DATABASE_ROUTERS=这个设置中,路由的顺序是很重要的,因为查询时是按这个设置中的顺序依次查询的。上例中,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)

您可能感兴趣的文章:

相关文章