python 中单独调用 django 的数据库模块

背景

最近用python做爬虫,爬取的数据需要入到数据库,本来都是一些小的爬虫程序,也没有用到任何框架,但是等数据入库的时候各种拼接sql语句,有时候文本中包含“,会直接报错,烦不胜烦,考虑是否有简单的数据库的orm框架,方便数据库这块的操作,考虑到之前接触过一些django的知识,就想从这方面入手。

Django简介

Django是一个由python写成开源的的web应用框架,采用mvc的设计模式。Django框架的核心包括:一个面向对象的映射器,用作数据模型(以Python类的形式定义)和关系性数据库间的媒介;一个基于正则表达式的URL分发器;一个视图系统,用于处理请求;以及一个模板系统。显然这里我们只需要Django的对象映射器帮助操作数据库。

单独接入Django数据库模块

我使用的python IDE是pycharm,使用过android studio的同学一定会对这个ide的界面很熟悉,因为他们都是JetBrains开发的一些列IDE的一员,界面风格十分相似,满满都是熟悉的味道。

1.Django安装

言归正传,要接入Django,首先要安装Django库,在pycharm中安装第三方库如下:

安装还是很方便的。

2.Django在项目中使用

前面说了我们只需要使用Django的对象映射器操作数据库,并不会使用到其他组建,标准的Django会有个setting.py,manager.py等配置,这里其实都不需要。根据我们的需求,其实我们只需要启动一个Django的环境,然后传入数据库配置,对应的实体映射关系即可。而Django其实是有这些方法实现我们的需求的。

talk is cheap,show me the code 所以换不多说,先上代码,首先是Entity.py的内容

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/6/2 上午11:15
# @Author  : pudgeli@tecncent.com
#import相关的Django类
from django.db import models
from django.conf import settings
import django

#外部调用django时,需要设置django相关环境变量

#设置INSTALLED_APPS信息
INSTALLED_APPS = [
    'Entity',
    # 'django.contrib.admin',
    # 'django.contrib.auth',
    # 'django.contrib.contenttypes',
    # 'django.contrib.sessions',
    # 'django.contrib.messages',
    # 'django.contrib.staticfiles',
]
#设置数据库信息
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',   #mysql的engine
        'NAME': 'plant',                        #数据库名称
        'USER': 'root',                         #数据库用户名
        'PASSWORD': '123456',                   #数据库密码
        'HOST': 'localhost',                    #主机地址
        'PORT': '3306',                         #数据库端口号
    }
}
#给Django配置相关信息
settings.configure(DATABASES=DATABASES, INSTALLED_APPS=INSTALLED_APPS)
#启动Django
django.setup()

#构造ORM的对象
class Animal_json(models.Model):
    name = models.CharField(db_column=u'name', max_length=512, primary_key=True)
    data_json = models.TextField(db_column=u'data_json')

    def __unicode__(self):
        return 'animal_json'

    class Meta:
        db_table = 'animal_json'

先给出Django文档中相关内容以供参考

settings.configuration说明

首先从settings.configuration讲起,Django文档里面说的很清楚:

Using settings without setting DJANGO_SETTINGS_MODULE

In some cases, you might want to bypass the DJANGO_SETTINGS_MODULE environment variable. For example, if you’re using the template system by itself, you likely don’t want to have to set up an environment variable pointing to a settings module.

In these cases, you can configure Django’s settings manually. Do this by calling:

django.conf.settings.configure(default_settings, **settings)¶
Example:

from django.conf import settings

settings.configure(DEBUG=True)
Pass configure() as many keyword arguments as you’d like, with each keyword argument representing a setting and its value. Each argument name should be all uppercase, with the same name as the settings described above.

大致意思是如果只是临时想使用一下Django部分功能而不像启动所有的DJANGO_SETTINGS_MODULE,可以通过settings.configutation配置django,使用configutration可以配置setting中任意的参数,参数名必须大写。 至于configuration的参数,可以参考settings说明,这里只给出上面使用到的两个参数的说明

1.INSTALLED_APPS

可以看出INSTALLED_APPS类型是数组,数组内容相应的python路径,表示在Django希望使用的class或package,

INSTALLED_APPS

Default: [] (Empty list)

A list of strings designating all applications that are enabled in this Django installation. Each string should be a dotted Python path to:

an application configuration class (preferred), or
a package containing an application.

2.DATABASES

DATABASES的类型是一个dictionary,字典中是相关的数据库配置,配置mysql需要使用以下第二种

DATABASES

Default: {} (Empty dictionary)

A dictionary containing the settings for all databases to be used with Django. It is a nested dictionary whose contents map a database alias to a dictionary containing the options for an individual database.

The DATABASES setting must configure a default database; any number of additional databases may also be specified.

The simplest possible settings file is for a single-database setup using SQLite. This can be configured using the following:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'mydatabase',
    }
}
When connecting to other database backends, such as MySQL, Oracle, or PostgreSQL, additional connection parameters will be required. See the ENGINE setting below on how to specify other database types. This example is for PostgreSQL:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

django.setup()说明

Django文档中说的很清楚,如果是启动web-server或Django-admin,Django会帮你自动启动Django环境,但是如果是想独立启动Django环境,则需要使用django.setup()

Calling django.setup() is required for “standalone” Django usage

If you’re using components of Django “standalone” – for example, writing a Python script which loads some Django templates and renders them, or uses the ORM to fetch some data – there’s one more step you’ll need in addition to configuring settings.

After you’ve either set DJANGO_SETTINGS_MODULE or called configure(), you’ll need to call django.setup() to load your settings and populate Django’s application registry. For example:

import django
from django.conf import settings
from myapp import myapp_defaults

settings.configure(default_settings=myapp_defaults, DEBUG=True)
django.setup()

# Now this script or any imported module can use any part of Django it needs.
from myapp import models
Note that calling django.setup() is only necessary if your code is truly standalone. When invoked by your Web server, or through django-admin, Django will handle this for you.

Entity说明

entity就比较简单,就是需要将与数据库中表映射的对象,继承Django的models.Model,Django环境启动后会自动映射到数据库中对应的表。使用起来也很简单:

from Entity import Animal_json
def getAnimals():
    global animals
    animals = Animal_json.objects.all()
    return animals

只需要上面几行代码,就可以读取Animal_json表中所有的数据,没有sql语句的拼接,也没有cursor数据的遍历,是不是很easy?

总结

使用过程中google了很多,虽然有很多都给出了类似的解决方案,但是并没有说明各种设置的意义,最有帮助的还是Django官方文档,解决了问题也了解了原理,官方文档才是王道,所以抓紧时间找个小伙伴一起学习外语吧!

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

李雄的专栏

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沃趣科技

ASM 翻译系列第十二弹:ASM Internal amdu - ASM Metadata Dump Utility

原作者:Bane Radulovic 译者: 庄培培 审核: 魏兴华 DBGeeK社群联合出品 amdu - ASM Metadata Dump U...

3565
来自专栏码农阿宇

Centos运行Mysql因为内存不足进程被杀

今天刚刚申请了一个新的域名,在申请完域名刚准备绑定给小伙伴分享注册新域名的喜悦时,刚把网站发到我们小伙伴们的讨论群里,却发现访问不了了,提示,数据库连接失败! ...

6765
来自专栏杨建荣的学习笔记

一条关于swap争用的报警邮件分析(一)(r7笔记第28天)

最近这些天有一台服务器总是会收到剩余swap过低的告警。 邮件内容大体如下: ############ ZABBIX-监控系统: --------------...

3504
来自专栏乐沙弥的世界

RMAN 数据库克隆文件位置转换方法

      在使用RMAN克隆数据库时,如果辅助数据库(新数据库)使用了与目标数据库(原数据库)使用了不同的路径,那么就存在位置转换的问题。在Oracle中,控...

631
来自专栏Java学习网

10 个影响程序性能的Hibernate 错误,学会让你少走弯路

我在很多应用程序中修复过性能问题,其中大部分都是由同样的错误引起的。修复之后,性能变得更溜,而且其中的大部分问题都很简单。所以,如果你想改进应用程序,那么可能也...

1765
来自专栏抠抠空间

Flask用SQLAlchemy连接MySQL

如果上面的例子继续写下去的时候,我们或许会在视图views中引入models文件以操作数据,在models文件中引入manage文件中的db以定义类和字段,

784
来自专栏后端之路

mybatis 批量更新

此前的方案在做批量时使用mybatis提供的batch model,该模式下将推迟所有的update(包括insert和delete)语句直到提交事务或者遇到一...

6779
来自专栏互联网高可用架构

初识分库分表框架DBSPLIT

1414
来自专栏数据和云

【循序渐进Oracle】Oracle的逻辑备份与恢复

编辑手记:针对最近发生的炉石及GitLab事件,我们不得不再次强调备份的重要性。DBA的四大守则,第一条就是备份重于一切。年初做好备份,愿你的系统17无恙。 本...

3718
来自专栏杨建荣的学习笔记

database replay基础学习(r4笔记第90天)

在11g中,database replay是一个很重要的新特性,按照这个特性的说法,可以完整地捕获数据库的负载信息,便于在需要的时候随时重放。 使用这种方法,可...

3538

扫码关注云+社区