【Django】连接数据库的学习

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)

有现成的东西用是挺好,但是大概了解一下怎么用也没什么坏处吧。
以上是个人理解,做个人记录,有不正确的地方还望指出。一起学习!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值