一、使用pymysql库连接数据库
1.在终端的项目路径下下载pymysql包:pip install pymysql
2.尝试pycharm连接数据库:
在项目目录下创建mysqltest目录(与应用同级,命名不要与包名相同,相同会优先调用自定义的而不是系统的),并创建mysqlTest.py文件。调用pymysql的connect方法,输入自己mysql的相关参数,连接成功后可以使用execute方法去执行相关sql语句,再次查看自己的mysql,若成功刷新后会显示数据
import pymysql
con=pymysql.connect(
user='root',
password='你的mysql密码',
host='localhost', #也可以是127.0.0.1, 开发项目时是远程链接的ip
port=3306,
database='想要连接的数据库'
)
print(con)
cursor=con.cursor()
#创建sql语句
# sql='create database db_pm '
# sql=('create table tb_un(id int not null primary key ,username varchar(5) , password int )')
sql=('select id from tb_un where username="张三"')
cursor.execute(sql)
print(cursor.execute(sql))
#关闭连接,释放资源
cursor.close()
con.close()
二、Django配置数据库连接
1.Django使用的是默认的sqllite3数据库,更改默认配置(前提是安装有pymysql库),修改项目下的settings.py ,将原有引擎和数据库名注掉,添加自己的引擎和相关参数
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
'ENGINE': 'django.db.backends.mysql',
'NAME': '你的数据库名',
'USER': 'root',
'PASSWORD': '数据库密码',
'HOST': '127.0.0.1',
'PORT': 3306,
}
}
2.由于python3.8版本前用的是mysql第三方库连接数据库,在此之后使用的是pymysql,因此会出现连接失败的现象。要在项目文件(与setting.py同级)__init__.py中添加pymysql替代mysqldb模块的代码
import pymysql
pymysql.install_as_MySQLdb()
3.要清楚的一点是Django是使用MVT框架,利用ORM(Object Relational Mapping)对象关系映射模型实现与数据库的互动。直白一点将就是应用的一个类就对应数据库中的一张表,类中的一个属性就对应表中一个字段。这就是说我们可以操作类和属性通过Django的操作mysql数据库。
4.创建模型类
在应用目录下的models.py(项目目录除了配置一些参数,其余其他操作都在其他目录)文件中创建用户模型(注意不需要设置id,系统会自己配置自增主键id)
class User(models.Model):
username = models.CharField(max_length=20, null=False, verbose_name="用户名")
password = models.CharField(max_length=20, null=False, verbose_name="密码")
gender = models.IntegerField(null=True, default=0, verbose_name="性别")
age = models.IntegerField(null=True, verbose_name="年龄")
phone = models.CharField(max_length=20, null=True, verbose_name="电话")
email = models.EmailField(max_length=32, null=True, verbose_name="邮件")
class Meta: # 子类,用于配置模型的 元数据 (metadata),即"关于模型的数据"
db_table = "tb_user"
然后生成迁移文件(用于生成数据库表的文件),命令(在应用目录下的终端)
python .\manage.py makemigrations
可能会报下面的错误:只需要pip install cryptography ,下载这个库就可以了(不报错不用理会)
RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
然后执行迁移文件(用于生成数据库表)
python manage.py migrate
出现以下界面就说明成功了(也可以刷新数据库,去查看有没有增加很多表,除tb_user外还有一些支持表)
接下来就可以操作对象(间接操作数据库了)
(1)终端输入命令> python manage.py shell
(2)导入模型类(还是在终端)>from book.models import User(类名)
(3)添加数据(刚刚创建的是空表):刷新对应表会有数据更新
user = User()
user.username = "admin"
user.password = "123456"
user.gender = 1
user.age = 20
user.phone = "15899998888"
user.email = "admin@qiku.com"
user.save()
(4)查询数据
查一条:user = User.objects.get(pk=1)
查所有:User.objects.all()
过滤查询:users = User.objects.filter(username='admin')
模糊查询:users = User.objects.filter(username__contains='ad')
.......
5.多表关联查询
在models.py创建多个类,A类作为主表,B为副表,B中有字段与A相关联(A的外键)
A类正常创建不需要额外添加字段,B中多一个外键属性
bookinfo=models.ForeignKey("BookInfo",on_delete=models.CASCADE)
外键名 外键 要关联的类名(A类名) 设置约束关系(这里是级联)
怎样体现多表关联呢?
若A类(A表)实例化一个对象a ,B类中有一个属性是所属部门(A类中有部门),B也有一个对象b,在实例化b的所属部门时可以:b.A类名小写=A.objects.get(department="b属于的部门名") , b.save() 查看数据库就会发现b匹配上了a中字段。