一、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.youkuaiyun.com/shanliangliuxing/article/details/7928562