django可以用哪些数据库?

导读:本篇文章首席CTO笔记来给大家介绍有关django可以用哪些数据库的相关内容,希望对大家有所帮助,一起来看看吧。

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

1.2之后, django支持在项目中使用多个DB. 那么到底如何使用呢?

1. 修改 settings.py

01DATABASES = {

02 \'default\': {

03 \'NAME\': \'app_data\',

04 \'ENGINE\': \'django.db.backends.postgresql_psycopg2\',

05 \'USER\': \'postgres_user\',

06 \'PASSWORD\': \'s3krit\'

07 },

08 \'users\': {

09 \'NAME\': \'user_data\',

10 \'ENGINE\': \'django.db.backends.mysql\',

11 \'USER\': \'mysql_user\',

12 \'PASSWORD\': \'priv4te\'

13 }

14}

15

16DATABASE_ROUTERS = [\'path.to.MyAppRouter\']

2. 实现自己的DB routers,这里决定了每个程序使用的是哪个DB。

01class 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 \'other\'

09 return None

10

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 \'other\'

15 return None

16

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 True

21 return None

22

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 == \'myapp\'

27 elif model._meta.app_label == \'myapp\':

28 return False

29 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

django可以用哪些数据库?  第1张

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

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

django开发用什么数据库好

使用多个数据库

New in Django 1.2: Please, see the release notes

大多数其他文档都假设使用单一数据库,本文主要讨论如何在 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.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中的sqlite3换成mysql

django

数据库使用(sqlite3和mysql)

一、sqlite3

使用

1、import

sqlite3

确认系统中是否安装

2、进入当前项目目录,cmd后运行python,进入命令行模式

3、import

sqlite3,

sqlite3.connect(\'{path\\name.db}\')

#大括号内表示自定义,真实情况没有大括号

4、修改settings.py文件

DATABASES

=

{

\'default\':

{

\'ENGINE\':

\'django.db.backends.sqlite3\',

\'NAME\':

{path\\name.db}\',

\'USER\':

\'\',

\'PASSWORD\':

\'\',

\'HOST\':

\'\',

\'PORT\':

\'\',

}

}

5、进入数据库文件界面,运行python

manage.py

shell

from

django.db

import

connection

cur

=

connection.cursor()

如果没报错,则表示配置成功

6、修改models.py文件,配置自己的表

例如:

from

django.db

import

models

from

django.contrib

import

admin

#

Create

your

models

here.

class

BlogPost(models.Model):

title

=

models.CharField(max_length

=

150)

body

=

models.TextField()

timestamp

=

models.DateTimeField()

class

Meta:

ordering

=

[\'-timestamp\']

7、创建数据库内容

python

manage.py

syncdb

根据提示输入,表示连接成功

注:以上只表示对数据库的创建,连接和使用,不包含其它内容。

二、mysql

1、确认安装mysql数据库

2、在mysql中创建数据库

命令模式下可以使用

CREATE

DATABASE

{name}

DEFAULT

CHARSET=utf8;

3、修改settings.py文件

DATABASES

=

{

\'default\':

{

\'ENGINE\':

\'django.db.backends.mysql\',

\'NAME\':

\'{name}\',

\'USER\':

\'{username}\',

\'PASSWORD\':

\'{password}\',

\'HOST\':\'localhost\',

#ip

\'PORT\':\'3306\',

}

}

4、修改models.py文件,配置自己的表

例如:

from

django.db

import

models

from

django.contrib

import

admin

#

Create

your

models

here.

class

BlogPost(models.Model):

title

=

models.CharField(max_length

=

150)

body

=

models.TextField()

timestamp

=

models.DateTimeField()

class

Meta:

ordering

=

[\'-timestamp\']

5、创建数据库内容

python

manage.py

syncdb

根据提示输入,表示连接成功

python常用的数据库有哪些?

1、数据收集:(1)Scrapy:协助使用者自动提取网页所需信息,并将其整理为表格或JSON格式的数据结构;(2)Selenium:使用者在感兴趣的网站上已经进行了交互行为之后,Seleniumn一般能派上用场;(3)BeautifulSoup:用来收集网站内容的Python库,更适合应用于规模相对较小的问题或一次性任务。

2、数据清理和转化:(4)Pandas:必须学习的,使用者可以运用Pandas操控处于Pandas数据框架内的数据,而且其内置巨量的函数,帮助使用者进行数据转换;(5)Numpy:必须学习的,Numpy将Python的对象列表拓展成了全面的多维度序列,而且其内置海量的数学函数;(6)Spacy:帮助使用者将自由文本转化为结构型数据,支持多种语言版本。

3、数据可视化:(7)Matplotlib:最全面的Python数据可视化库;(8)Plotly:只需要写最少的代码就能得出最多彩缤纷的图像。

4、数据模块化:(9)Scikit Learn:高级分析师,开启机器学习之旅,有六大主要模块:数据预处理,维度缩减,数据回归,数据分类,数据聚类分析,模型选择;(10)Tensorflow:由谷歌推出的来源机器学习库,是一个基于网页自动生成的仪表盘,它将数据学习流和结果进行了可视化处理,这一功能对于排错和展示都十分有用;(11)PyTorch:由Facebook发布的一个开源库,用作Python的公共机器学习框架。

5、音频和图像识别:(12)OpenCV:是最常用的图像和视频识别库,能让Python在图像和视频识别领域完全替代Matlab,不仅支持Python,还支持JAVA和Matlab;(13)Librosa:是一个非常强大的音频和声音处理Python库,可以从音频段中提取各个部分,例如节奏以及节拍。

6、网页:(14)Django:开发网页服务后端,设计理念是能用几行代码就建立一个网站的高级框架;(15)Flask:是一个用于Python的轻量级网页开发框架。

结语:以上就是首席CTO笔记为大家整理的关于django可以用哪些数据库的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~

以上内容为新媒号(sinv.com.cn)为大家提供!新媒号,坚持更新大家所需的互联网后端知识。希望您喜欢!

版权申明:新媒号所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请发送邮件至 k2#88.com(替换@) 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023-09-23
下一篇 2023-09-23

相关推荐

发表回复

登录后才能评论