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

相关文章

来自专栏有趣的Python

7- vue django restful framework 打造生鲜超市 -商品类别数据展示(上)

Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 商品列表页 并没有将列表页的数据j...

41412
来自专栏北京马哥教育

Python框架:Django写图书管理系统(LMS)

今天我会带大家真正写一个Django项目,对于入门来说是有点难度的,因为逻辑比较复杂,但是真正的知识就是函数与面向对象,这也是培养用Django思维写项目的开始

730
来自专栏finleyMa

Laravel 用户权限管理

实现基于user,role,permission三表的权限管理 因为一个用户可能拥有多种role,而一种role能同时被多个用户拥有。所以要建立多对多关系。 ...

1335
来自专栏七夜安全博客

1.4 Django基础篇--数据库模型设计

1193
来自专栏IMWeb前端团队

Node.js ORM 框架 sequelize 实践

本文作者:IMWeb zzbozheng 原文出处:IMWeb社区 未经同意,禁止转载 Node.js ORM 框架 sequelize 实践 最近在...

37810
来自专栏北京马哥教育

浅谈Python Django框架

Python下有多款不同的 Web 框架,Django是最有代表性的一种。许多成功的网站和APP都基于Django。

832
来自专栏Django Scrapy

Django安装及简单使用1.5

Django安装及简单使用1.5 代码都在github: URL:https://github.com/njxshr/codes/tree/master/t...

3137
来自专栏Java帮帮-微信公众号-技术文章全总结

Java开发Struts2案例代码

一、struts2综合案例 1、建立一个JavaWeb应用 ? 2、拷贝一下内容到您应用中:美工MM给你准备好的 ? 3、搭建Struts2的开发环境 a、拷贝...

3256
来自专栏增长技术

Django实践:自定义用户系统

522
来自专栏.net core新时代

数据字典生成工具之旅(2):数据字典生成工具及文档工具作用介绍

       上一篇介绍完了整个架构和功能,这一篇将更加详细介绍功能和操作,将会以实际例子帮助理解!(预告:下一篇正式进入实现原理讲解) 阅读目录 开始使用工具...

1935

扫码关注云+社区