麒麟v10 上部署 TiDB v5.1.2 生产环境优化实践
870
2023-12-15
导读:本篇文章首席CTO笔记来给大家介绍有关django支持哪些数据库的相关内容,希望对大家有所帮助,一起来看看吧 什么是django?Django是用Python开发的一个免费开源的Web框架,提供了许多网站后台开发经常用到的模块,使开发者能够专注于业务部分。
并且囊括的Web应用部分可以用于快速搭建高性能、优雅的网站并且提供了通用Web开发模式的高度抽象,通过DRY的理念为频繁进行的编程作业提供了快速解决方法Django能在开源发行之后吸引众多追随者,离不开它所具备的以下优点:
①齐全的功能自带大量常用工具和框架,可轻松、迅速开发出一个功能齐全的Web应用②完善的文档Django已发展十余年,具有广泛的实践案例,同时Django提供完善的在线文档,Django用户能够更容易地找到问题的解决方案。
③强大的数据库访问组件Django自带一个面向对象的、反映数据模型与关系型数据库间的映射关系的映射器,开发者无须学习SQL语言即可操作数据库④灵活的URL映射Django提供一个基于正则表达式的URL分发器,开发者可灵活地编写URL。
⑤丰富的模板语言Django模板语言功能丰富,支持自定义模板标签;Django也支持使用第三方模板系统,如jinja2等⑥健全的后台管理系统Django内置了一个后台数据管理系统,经简单配置后,再编写少量代码即可使用完整的后台管理功能。
⑦完整的错误信息提示Django提供了非常完整的错误信息提示和定位功能,可在开发调试过程中快速定位错误或异常⑧强大的缓存支持Django内置了一个缓存框架,并提供了多种可选的缓存方式⑨国际化Django包含了一个国际化系统,Django组件支持多种语言。
django支持***吗支持首先需要下载一个cx_***的类库,下载时注意区分win版本和linux版本,注意python的版本号,注意oralce的版本号#数据库连接配置DATABASES = {default: {。
ENGINE: django.db.backends.***, NAME: actdb22, #注意这儿是sid不是SERVICE_NAME USER: name,
PASSWORD: pwd, HOST: 127.0.0.1, PORT: 1521,}}
【Python基础】django默认数据库是什么?没有配置的话默认数据库是sqlite,可以在setting里的DATABASES进行数据库配置django是做什么的?Django是基于Python的免费和开放源代码Web框架,它遵循模型-模板-视图(MTV)体系结构模式。
它由Django Software Foundation(DSF)维护,这是一个由非营利组织成立的独立组织Django的主要目标是简化复杂的,数据库驱动的网站的创建该框架强调组件的可重用性和“可插入性”,更少的代码,低耦合,快速开发以及不重复自己的原则。
整个过程都使用Python,甚至用于设置文件和数据模型Django还提供了一个可选的管理创建,读取,更新和删除界面,该界面通过自省动态生成并通过管理模型进行配置一些使用Django的知名网站包括公共广播服务,Instagram, Mozilla,华盛顿时报, Disqus,Bitbucket,和Nextdoor。
Django创建于2003年秋天,当时《劳伦斯日报》世界报纸的网络程序员Adrian Holovaty和Simon Willison开始使用Python来构建应用程序西蒙·威利森(Simon Willison)的实习期结束前不久,雅各布·卡普兰·莫斯(Jacob Kaplan-Moss)在Django的发展中就被聘用了。
它于2005年7月在BSD许可下公开发布该框架以吉他手Django Reinhardt的名字命名2008年6月,宣布新成立的Django软件基金会(DSF)将来将维护Django2015年7月,与一些Django联合创始人和开发人员建立联系的软件咨询公司Revolution Systems在劳伦斯举办了10周年纪念活动。
Django的设计理念如下:松耦合——Django的目标是使堆栈中的每个元素彼此独立更少的编码——更少的代码,因此可以快速开发不重复自己(DRY)——一切都应该只在一个地方开发,而不是一次又一次地重复快速开发——Django的理念是尽一切可能促进超快速开发。
简洁的设计——Django严格按照自己的代码维护简洁的设计,并易于遵循最佳的Web开发实践Django的一些优势如下:对象关系映射(ORM)支持——Django在数据模型和数据库引擎之间建立了桥梁,并支持包括MySQL,***,Postgres等在内的大量数据库系统。
多语言支持——Django通过其内置的国际化系统支持多语言网站因此,您可以开发支持多种语言的网站框架支持——Django内置了对Ajax,RSS,缓存和其他各种框架的支持GUI——Django为管理活动提供了一个很好的即用型用户界面。
开发环境——Django带有轻量级的Web服务器,以促进端到端应用程序的开发和测试Django是Python Web框架和大多数现代框架一样,Django支持MVC模式关于Python的基础问题可以看下这个网页的视频教程,网页链接,希望我的回答能帮到你。
django开发用什么数据库好使用多个数据库New in Django 1.2: Please, see the release notes大多数其他文档都假设使用单一数据库,本文主要讨论如何在 Django 中使用多个数据库。
使用多个数据库,要增加一些步骤定义你的数据库 使用多数据库的第一步是通过 DATABASES 设置要使用的数据库服务这个 设置用于映射数据库别名和特定的联结设置字典,这是 Django 定义数据库一贯的手法。
字典内部的设置参见 DATABASES 文档 数据库可以使用任何别名,但是 default 有特殊意义当没有选择其他数据库时, Django 总是使用别名为 default 的数据库因此,如果你没有定义一个名为 default 的数据库时,你应当小心了,在使用数据库前要指定你想用的数据库。
以下是一个定义两个数据库的 settings.py 代码片断定义了一个缺省的 *** 数据库和一个名为 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.py syncdb
$ ./manage.py syncdb --database=users如果你不是同步所有的程序到同一个数据库中,你可定义一个 数据库路由 来为指定的模型实施特定的控制 策略 如果你要精细地控制同步,那么还有一种方式是修改 sqlall 的输出,手工在 数据库中执行命令,命令如下: 。
$ ./manage.py sqlall sales | ./manage.py dbshell使用其他管理命令 其他操作数据库的 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 数据库本例使用了两个路由: 。
class MyAppRouter(object): """ 一个控制 myapp 应用中模型的 所有数据库操作的路由 """ def db_for_read(self, model, **hints): "myapp 应用中模型的操作指向 other" if model._meta.app_label == myapp: return other return None def db_for_write(self, model, **hints): "myapp 应用中模型的操作指向 other" if model._meta.app_label == myapp: return other return None def allow_relation(self, obj1, obj2, **hints): " 如果包含 myapp 应用中的模型则允许所有关系 " if obj1._meta.app_label == myapp or obj2._meta.app_label == myapp: return True return None def allow_syncdb(self, db, model): " 确保 myapp 应用只存在于 other 数据库 " if db == other: return model._meta.app_label == myapp elif model._meta.app_label == myapp: return False return None class MasterSlaveRouter(object): """ 一个设置简单主/从定义 的路由 """ def db_for_read(self, model, **hints): " 所有读操作指向一个随机的从数据库 " return random.choice([slave1,slave2]) def db_for_write(self, model, **hints): " 所有写操作指向主数据库 " return master def allow_relation(self, obj1, obj2, **hints): " 允许数据库池中的两个对象间的任何关系 " db_list = (master,slave1,slave2) if obj1._state.db in db_list and obj2._state.db in db_list: return True return None def allow_syncdb(self, db, model): " 显示地放置所有数据库中的模型 " return True
然后在你的设置文件增加如下内容(把 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=Douglas Adams) # 新对象创建时还没有分配数据库 mh = Book(title=Mostly Harmless) # 这个赋值会向路由发出请求,并把 mh 的数据库设置为与 author 对象同样的 # 数据库 mh.author = dna # 这会强制 mh 实例使用主数据库... mh.save() # ... 但如果我们重新获取对象,就会从从数据库中获取 mh = Book.objects.get(title=Mostly Harmless)
手动选择数据库 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 执行了一个INSERT SQL 语句这样就会创建一个 主键,并将这个主键分配给 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 执行 一个 INSERT SQL:
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 方法返回一个自定义 查询集 类,那么你可以 这样做: class MyManager(models.Manager): def get_query_set(self): qs = CustomQuerySet(self.model) if self._db is not None: qs = qs.using(self._db) return qs
在 Django 管理接口中使用多数据库 Django 的管理接口没有明显支持多数据库如果想要支持的话你必须写自定义 ModelAdmin 如果要支持多数据库,那么 ModelAdmin 对象有五个方法要自定义: 。
class MultiDBModelAdmin(admin.ModelAdmin): # 为方便起见定义一个数据库名称常量 using = other def save_model(self, request, obj, form, change): # 让 Django 保存对象到 other 数据库。
obj.save(using=self.using) def delete_model(self, request, obj): # 让 Django 从 other 数据库中删除对象 obj.delete(using=self.using) def queryset(self, request): # 让 Django 在 other 数据库中搜索对象。
return super(MultiDBModelAdmin, self).queryset(request).using(self.using) def formfield_for_foreignkey(self, db_field, request=None, **kwargs): # 让 Django 基于 other 数据库生成外键控件。
return super(MultiDBModelAdmin, self).formfield_for_foreignkey(db_field, request=request, using=self.using, **kwargs) def formfield_for_manytomany(self, db_field, request=None, **kwargs): # 让 Django 基于 other 数据库生成多对多关系控件。
return super(MultiDBModelAdmin, self).formfield_for_manytomany(db_field, request=request, using=self.using, **kwargs)。
如何在django中使用多个数据库1.2之后, django支持在项目中使用多个DB. 那么到底如何使用呢?1. 修改 settings.py01DATABASES = {02 default: {
03 NAME: app_data,04 ENGINE: django.db.backends.postgresql_psycopg2,05 USER: postgres_user,
06 PASSWORD: s3krit07 },08 users: {09 NAME: user_data,10 ENGINE: django.db.backends.mysql,
11 USER: mysql_user,12 PASSWORD: priv4te13 }14}15 16DATABASE_ROUTERS = [path.to.MyAppRouter]
2. 实现自己的DB routers,这里决定了每个程序使用的是哪个DB01class MyAppRouter(object):02 """A router to control all database operations on models in。
03 the myapp application"""04 05 def db_for_read(self, model, **hints):06 "Point all operations on myapp models to other"
07 if model._meta.app_label == myapp:08 return other09 return None10 11 def db_for_write(self, model, **hints):
12 "Point all operations on myapp models to other"13 if model._meta.app_label == myapp:
14 return other15 return None16 17 def allow_relation(self, obj1, obj2, **hints):
18 "Allow any relation if a model in myapp is involved"19 if obj1._meta.app_label == myapp or obj2._meta.app_label == myapp:
20 return True21 return None22 23 def allow_syncdb(self, db, model):24 "Make sure the myapp app only appears on the other db"
25 if db == other:26 return model._meta.app_label == myapp27 elif model._meta.app_label == myapp:
28 return False29 return None同步数据库的时候,默认会同步到Default数据库,当然也可以通过 --database 来指定同步哪一个, 如下:
[plain] view plain copy print?tt class="xref std std-djadminopt docutils literal" style="text-decoration: none; white-space: nowrap; color: rgb(35, 79, 50); margin-left: 0px; margin-right: 0px; border-bottom-width: 1px; border-bottom-color: rgb(35, 79, 50); border-bottom-style: dotted; "$ ./manage.py syncdb
$ ./manage.py syncdb --database=users/tt 那么程序中如何来选择呢?比如,下面的代码将选择default数据库[python] view plain copy print?
span style="font-family:monospace;color:#234f32;" # This will run on the default database. Author.objects.all()
# So will this. Author.objects.using(default).all()/span 但是下面的代码将选择other数据库[python] view plain copy print?
span style="font-family:monospace;color:#234f32;" # This will run on the other database. Author.objects.using(other).all()/span
上面是查询的情况,保存的使用也一样,也是通过using来指定,如下:[python] view plain copy print?span style="font-family:monospace;color:#234f32;" my_object.save(using=legacy_users)/span
删除的时候[python] view plain copy print?span style="font-family:monospace;color:#234f32;" u = User.objects.using(legacy_users).get(username=fred)
u.delete() # will delete from the `legacy_users` database/span结语:以上就是首席CTO笔记为大家整理的关于django支持哪些数据库的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。