参考:Python连接MySQL数据库之pymysql模块使用
1、通过pymysql连接
1、pip安装pymysql
在windows上面安装pymysql需要找到对应的python安装目录,然后通过pip命令进行安装,操作如下(参考:https://www.cnblogs.com/chaojiyingxiong/p/9456063.html):
2、建立连接
import pymysql
def db_conn():
conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
# 得到一个可以执行SQL语句的光标对象
cursor = conn.cursor()
sql = """
CREATE TABLE USER1 (
id INT auto_increment PRIMARY KEY ,
name CHAR(10) NOT NULL UNIQUE,
age TINYINT NOT NULL
)ENGINE=innodb DEFAULT CHARSET=utf8;
"""
# 执行SQL语句
cursor.execute(sql)
# 关闭光标对象
cursor.close()
# 关闭数据库连接
conn.close()
建立连接之后,执行操作就是按照对应sql来执行,不跟你bb,在下告辞。
2、通过SQLAlchemy连接
1、配置文件
创建配置文件config.py,内容如下:
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:12345678@localhost:3306/mydb'
# 'mysql+pymysql://用户名称:密码@localhost:端口/数据库名称'
SQLALCHEMY_TRACK_MODIFICATIONS = True
2、创建连接
创建携带config信息的全局应用对象,并以此创建SQLAlchemy对象,如下:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app, use_native_unicode='utf8')
3、对象绑定表
看一下user对象如何通过SQLAlchemy进行表的绑定。
# -*- coding: utf-8 -*-
from datetime import datetime, date
from . import app
from . import db
from passlib.apps import custom_app_context as pwd_context
from itsdangerous import (TimedJSONWebSignatureSerializer
as Serializer, BadSignature, SignatureExpired)
class User(db.Model):
"""用户"""
__tablename__ = 'users'
__table_args__ = {'mysql_engine': 'InnoDB'} # 支持事务操作和外键
id = db.Column(db.String(32), doc='手机号码', primary_key=True)
nickname = db.Column(db.String(20), doc='昵称', default='Wanted User', nullable=False, unique=True)
password_hash = db.Column(db.String(128), doc='密码', nullable=False)
payPassword = db.Column(db.String(32), doc='支付密码', nullable=False)
money = db.Column(db.Float, doc='账户余额', default=50, nullable=False)
description = db.Column(db.String(50), doc='个性签名', default='这个人很懒,什么也没留下', nullable=False)
4、数据库操作
因为对象已经绑定了数据库表,并且入参为 db.Model,所以可以直接使用对应方法,参考:flask连接mysql数据库操作:
from app import db
# 定义数据模型, 设置表格中各个字段的数据类型
class Grade(db.Model):
g_id = db.Column(db.Integer,primary_key=True,autoincrement=True)
g_name = db.Column(db.String(30),nullable=False, unique=True)
g_num = db.Column(db.Integer, nullable=True)
__tablename__ = 'grade'
def __init__(self, name, num):
self.g_name = name
self.g_num = num
# 生成表格
db.create_all()
# -------------新增操作---------------------
grade1 = Grade('py5',38)
grade2 = Grade('py6',28)
# session:是一块临时存储区域, 用来暂存数据库操作的数据, 最终通过commit统一提交给数据库.
db.session.add(grade1)
db.session.add(grade2)
db.session.commit()
## ------------查询操作---------------------
# 数据查询(查询所有数据)
result = Grade.query.all()
for item in result:
print(item.g_name, item.g_num, item.g_id)
# 按照主键值查询
result = Grade.query.get(1)
print(result)
# 按条件查询, filter()设置对应的过滤条件, 完成数据的过滤操作
result = Grade.query.filter(Grade.g_num > 20).all()
print(result)
# 数据库分页查询, paginate(参数1, 参数2, 参数3), 参数1代表查询的页码, 页码值从1开始; 参数2代表每一页查询的总数据条数; 参数3是布尔类型,用来设定当查询超出范围时, 以何种方式返回结果, 默认为True, 以404错误信息返回, 如果为False此时以空列表形式返回.
result = Grade.query.paginate(2, 5, False)
print(result.items)
# 获取查询结果的总数量
count = Grade.query.count()
# 按条件查询所有满足的结果的个数
count = Grade.query.filter(Grade.g_num > 30).count()
print(count)
# 从查询结果中提取指定数量的数据(利用列表'切片'提取需要的对象)
result = Grade.query.filter(Grade.g_num > 30).all()[1:3]
print(result)
# 多条件查询语句 startswith:以指定字符开头
result = Grade.query.filter(Grade.g_name.startswith('py'),Grade.g_num > 30).all()
from sqlalchemy import *
"""
sqlalchemy模块内置的查询条件
and_(): 并且
or_(): 或者
not_(): 非, 条件只能一个
"""
result = Grade.query.filter(and_(Grade.g_name.startswith('py'),Grade.g_num > 30)).all()
result = Grade.query.filter(not_(Grade.g_num > 30)).all()
print(result)
# ------------------删除操作----------------------
# 数据库的删除 先查询再删除
grades = Grade.query.filter(Grade.g_id > 9).all()
for item in grades:
db.session.delete(item)
db.session.commit()
# ---------------------------修改操作----------------
# 数据修改 查询后修改
grade_1 = Grade.query.filter(Grade.g_num > 30).first()
grade_1.g_num = 25
db.session.commit()