Django如何连接数据库
Django只是一个框架,方便但是其中有些原理还是云里雾里的,知道用,但是不知道为什么要这么用。这里先研究一下数据库的连接。
Django连接数据库会牵扯到:数据库、用来连接数据库进行数据库操作的引擎、settings.py文件、models.py文件以及两个命令的使用。
1 数据库
要连接数据库,那肯定得有一个数据库,关于数据库的安装就不说了,自己去弄。(这里用pg数据库。)
记住数据库的名字,我这里名字叫做“databaseY”,一会儿要用到。
2 连接数据库进行数据库操作得引擎
自己尝试用python直接连接数据库的时候才发现。
要连接哪家的数据库就下载哪家的引擎(也就是包),他们写好了方法,我们去用就好。
比如这里,用的是psycopg2,用来连接pg数据库。
安装psycopg2
pip install psycopg2
使用的时候就是
import psycopg2
psycopg2.connect(option) # option里面放连接的参数 数据库的名字、端口这些
就是这里就和后面连接起来了。想!
1、django怎么知道我连接的是哪家的数据库?
2、django是怎么把psycopg2像我这里这样用起来的?
3、option在哪里设置呢?
3 在哪连?——settings.py
问题1、3在这里就可以解答。
Django将他放在了settings.py里面,(很多配置的内容都可以在这个文件里面找),有一个DATABASE对象,没修改前是放了他自己的一个数据库,修改成我们自己的。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # 用哪家数据库就用哪家的引擎,要下载
'NAME': 'databaseY', # option参数 数据库的名字,之前创建的时候的名字
'USER': '***', # option参数 数据库用户的名字
'PASSWORD': '***', # option参数 数据库用户的密码
'HOST': '', # option参数 要连接的数据库的地址,不设置就是默认localhost
'PORT': '***' # option参数 要连接的数据库的端口
}
}
4 建表?——model.py
有了数据库,还需要数据表,但是数据表放在哪?从哪放?
Django不需要我们自己在数据库里面创建表,要是需要自己创表,那不得又要配?修改了数据库又要修改表配置?那不得累晕?。。。所以Dajngo里面的model.py文件有用了。
在model.py文件里面,一个类就是一张表,表里面的字段可以自己定,表的名字也可以自己定。
class SystemUser(models.Model):
username = models.CharField(max_length=10, unique=True) # 表字段
password = models.CharField(max_length=20)
img_path = models.CharField(max_length=100, null=True)
class Meta:
db_table = 'systemUserTable' # 设置表名
def __str__(self):
return self.username # 这里只是为了在pring()的时候不是对象,而是字符串
这样,我们就定义好了一张表。但是这个时候数据库里面是没有这张表的,我们得把这张表让Django帮我们创建。
所以用到以下两个命令了。
如果你用的是pycharm的话,就直接在terminal里面输入这两行,你就可以看到你的表了,还会有其他的一些表也跟着创建了,但是不用管,也别删(可能会出问题)。还可能会出现一些意想不到的问题,可以去百度别人的方法,大部分还是可以解决的,然后就可以使用了。
python manage.py makemigrations
python manage.py migrate
5 如果自己用Python代码怎么连接数据库?
class Database(object):
def __init__(self, database, user="postgres", password="123456", host="localhost", port=5432):
# 设置要连接数据库需要用的参数
self.database = database
self.user = user
self.password = password
self.host = host
self.port = port
def creat_table(self, name):
"""
创建表
:param name: 表名
:return:
"""
conn = psycopg2.connect(database=self.database, user=self.user, password=self.password, host=self.host,
port=self.port)
cursor = conn.cursor()
# 列名称写死了
# 给我怎么变活!!!还没解决。。。 所以这是问题,表的列名每次都这样写,谁受得了?。我受不了
create_table_str = "CREATE TABLE if not exists " + name + "(name1 varchar(60) PRIMARY KEY NOT NULL, " \
"name2 varchar(30) NOT NULL, dem varchar(30)," \
"name3 varchar(30), aspect varchar(30), " \
"name4 varchar(30))"
cursor.execute(create_table_str)
conn.commit()
# 关闭游标
cursor.close()
# 关闭数据库连接
conn.close()
def insert(self, table, data):
# 在表里面插入数据
conn = psycopg2.connect(database=self.database, user=self.user, password=self.password, host=self.host,
port=self.port)
cursor = conn.cursor()
# do nothing是在主键冲突时防止SQL报错,若主键冲突则什么也不做
# insert_sql = "INSERT INTO " + table + " values(%s,%s,%s)"
insert_sql = "INSERT INTO " + table + " values(%s,%s,%s,%s,%s,%s)"
cursor.executemany(insert_sql, data)
# 提交SQL命令
conn.commit()
# 关闭游标
cursor.close()
# 关闭数据库连接
conn.close()
pass
# 在表里面搜索数据
def get_data(self, table):
conn = psycopg2.connect(database=self.database, user=self.user, password=self.password, host=self.host,
port=self.port)
cursor = conn.cursor()
# do nothing是在主键冲突时防止SQL报错,若主键冲突则什么也不做
query_sql = "SELECT * FROM " + table
cursor.execute(query_sql)
data = cursor.fetchall()
# 提交SQL命令
conn.commit()
# 关闭游标
cursor.close()
# 关闭数据库连接
conn.close()
return data
反正还是有些麻烦。
如果用Django。那查询的时候就简单了。
db_obj=models.SystemUser.objects.filter(id=2)
print(db_obj.query)
有现成的东西用是挺好,但是大概了解一下怎么用也没什么坏处吧。
以上是个人理解,做个人记录,有不正确的地方还望指出。一起学习!