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 条评论
登录 后参与评论

相关文章

来自专栏SDNLAB

OpenDaylight控制器MD-SAL解析

一.前言 OpenDaylight开源控制器是业界当前比较流行的SDN控制器,其受到业界关注的主要原因是其具有良好的适应性,可适配不同的南向接口以控制现网各种各...

45010
来自专栏苍云横渡学习笔记

【第二部分-django博客从搭建到部署】一个完整Django入门指南

【学习目录】 【第一部分-django博客从搭建到部署】一个完整的Django入门指南学习笔记 【第二部分-django博客从搭建到部署】一个完整的Django...

3945
来自专栏JackieZheng

Spring实战——XML和JavaConfig的混合配置

前言 看了园龄已经两年多了,再不能写完内容直接点击发布,留下一片密密麻麻的文字让别人看的头昏脑涨。所以现在每次写完主要内容后,还需要对于格式稍稍调整下。那么有没...

2126
来自专栏Kubernetes

kube-proxy源码分析

##kube-proxy介绍 请参考我的另一篇博文:kube-proxy工作原理 ##源码目录结构分析 cmd/kube-proxy //负责kub...

4545
来自专栏逸鹏说道

C# 实现发送手机短信

现在很多网站都是短信发送的功能,怎么实现的呢。对于个人站长来说的话,通过使用SMS短信通API接口相对比较划算和简单。那怎么实现呢,步骤如下: 1. 从网上(h...

6444
来自专栏刘望舒

Android输入系统的事件传递流程和IMS的诞生

很多同学可能会认为输入系统是不是和View的事件分发有些关联,确实是有些关联,只不过View事件分发只能算是输入系统事件传递的一部分。这个系列讲的输入系统主要是...

262
来自专栏恰同学骚年

CMS项目实践学习总结

  这个暑假把ITCAST的2011年2月的.NET就业班的视频看了一遍,因为以前把免费的2010版和2011版的视频都看了一遍,所以这次选择了其中的几个部分作...

1105
来自专栏增长技术

Android文件存储使用

一般地,通过 Context 和 Environment 相关的方法获取文件存取的路径。

672
来自专栏Seebug漏洞平台

Django CSRF Bypass (CVE-2016-7401) 漏洞分析

Author: p0wd3r (知道创宇404安全实验室) Date: 2016-09-28 0x00 漏洞概述 1.漏洞简介 Django是一个由Python...

2905
来自专栏有趣的django

CRM客户关系管理系统(二) 第三章、前端页面设计

2270

扫码关注云+社区