Django新建项目与直接执行SQL语句

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15783243/article/details/82155035

一、pycharm新建项目

新建后的项目结构:

 

二、django 链接mysql数据库

配置setting

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 数据库引擎
        'NAME': 'ttt_ans', #数据库名称
        'USER': 'rrr', # 链接数据库的用户名
        'PASSWORD': 'ddarthc', # 链接数据库的密码
        'HOST': '10.100.22.34', # mysql服务器的域名和ip地址
        'PORT': '3306', # mysql的一个端口号,默认是3306
    }
}

如果直接配置完setting后,一般会出现找不到数据库的情况:

运行后django报错,提示django.db.utils.OperationalError: no such table.

然后在需要的项目中,把 __init__.py或者*.py中添加两行:
import pymysql
pymysql.install_as_MySQLdb()

三、配置url

四、实现数据查询:

你可能需要执行不明确对应模型的查询或者直接执行 UPDATE 、 INSERT 或 DELETE 查询。

在这种情况下,你可以直接操作数据库,完全绕开模型层。

django.db.connection 对象表现缺省数据库连接, django.db.transaction 表现缺省数据库事务。要使用数据库连接可以调用 connection.cursor() 来得到一个指针对象。然后,就可以调用 cursor.execute(sql, [params]) 来执行 SQL 和 cursor.fetchone() 或 cursor.fetchall() 来返回结果行。在执行一个改变数据的操作后,你应当调用 transaction.commit_unless_managed() 来确保你的改变被提交。如果只是获取数据就不必提交了。例如:

def my_custom_sql():
    from django.db import connection, transaction
    cursor = connection.cursor()

    # Data modifying operation - commit required
    cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
    transaction.commit_unless_managed()

    # Data retrieval operation - no commit required
    cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
    row = cursor.fetchone()

    return row

如果你使用多个数据库,那么可以使用 django.db.connections 来获得指定数据库的连接(和指针)。 django.db.connections 是一个类似字典的对象,允许你通过别名来获得指定数据库的连接:

from django.db import connections
cursor = connections['my_db_alias'].cursor()
# Your code here...
transaction.commit_unless_managed(using='my_db_alias')

5、将操作数据库的代码进行封装:

import logging
from django.db import connection

LOG = logging.getLogger("boss")


        def dictfetchall(cursor):
        "Return all rows from a cursor as a dict"
        desc = cursor.description
        if desc == None:
        return []
        columns = [col[0] for col in desc]
        # for row in cursor.fetchall():
        #     rows.append(row)
        return [
        dict(zip(columns, row))
        for row in cursor.fetchall()
        ]


        def dictfetone(cursor):
        desc = cursor.description
        if desc == None:
        return None
        columns = [col[0] for col in desc]
        row = cursor.fetchone()
        if row == None:
        return None
        return dict(zip(columns, row))


        def fetchall(sql, params=[]):
        cursor = connection.cursor()
        cursor.execute(sql, params)
        ret = dictfetchall(cursor)
        return ret


        def fetchone(sql, params=[]):
        cursor = connection.cursor()
        cursor.execute(sql, params)
        ret = dictfetone(cursor)
        cursor.close()
        return ret


        def executeDb(sql, params=[]):
        cursor = connection.cursor()
        ret = cursor.execute(sql, params)
        cursor.close()
        return ret

在代码中看到 cursor执行完之后,执行close。想到diango的mysql连接是不是没有做连接池?带着这个疑问上网查看,发现果然有这方面的文档。后来看官网时发现:

django最新版本已经包含了连接池,通过修改配置控制,官方文档:https://docs.djangoproject.com/en/1.9/ref/databases/

参考:

https://blog.csdn.net/shanliangliuxing/article/details/7928562

猜你喜欢

转载自blog.csdn.net/qq_15783243/article/details/82155035