python 数据库框架pyMysql+Flask -SQLAIchemy
pyMysql
1.安装:
cmd输入:(venv)pip install pyMySQL
1.1导入:
import pymysql
示列:在app=Flask(__name__)下面添加如下代码:
from flask import Flask,render_template
import pymysql
app = Flask(__name__)
conn=pymysql.Connect(host='127.0.0.1', #地址port=3306, #端口user='root', #用户名password='root', #密码db='demo-1', #连接数据库的名称charset='utf8' #设定连接数据的字符集编码
)
说明:
python 建立了与数据库的连接,其实是建立了一个MysqlLdb.connect()的连接对象,python 就是通过连接对象与数据库进行交互。connection 常用的方法有4种。
方法名 | 说明 |
---|---|
cursor() | 创建一个游标对象并返回 |
commit() | 提交当前事务操作,对数据库的增删改查先保存到缓存里,当执行此方法后在提交给数据库。 |
rollback() |
回滚当前事务操作,取消前面会话中的增删改查操作。 |
close() | 关闭数据库连接操作。 |
查询示列:
spl='select * from tb_1' #设定查询语句
cursor=conn.cursor() #设定游标对象
cursor.execute(spl) #执行语句
results=cursor.fetchall() #接收全部
print(results) #输出
光标对象支持的一些方法:
方法名 | 说明 |
---|---|
execute() | 执行一个数据库查询的语句 |
fetchone() | 获取结果集中的下一行 |
fetchmany(size) | 获取结果集中的下一行 |
fetchall() | 获取结果集中剩下所有行 |
rowcount | 最近一次执行数据库查询命令后,返回数据的行数 |
close() | 关闭游标 |
增加示列:
cursor=conn.cursor() #创建游标对象try:sql='insert into tb_1 values (12,"da")'cursor.execute(sql)conn.commit() #提交事务
except Exception as a: #如果有错误,捕获异常print(a)
conn.rollback() #事务回滚
cursor.close() #关闭游标
conn.close() #关闭连接对象
修改示列:
cursor=conn.cursor() #创建游标对象try:sql='update tb_1 set name="chi" where id=6' #修改cursor.execute(sql)conn.commit() #提交事务
except Exception as a: #如果有错误,捕获异常print(a)
conn.rollback() #事务回滚
cursor.close() #关闭游标
conn.close() #关闭连接对象
删除示列:
cursor=conn.cursor() #创建游标对象try:sql='delete from tb_1 where name="da"' #删除cursor.execute(sql)conn.commit() #提交事务
except Exception as a: #如果有错误,捕获异常print(a)
conn.rollback() #事务回滚
cursor.close() #关闭游标
conn.close() #关闭连接对象
总结:关键字:‘游标对象’,‘连接对象’,‘’事务提交‘’,‘回滚’,‘关闭连接对象’,‘关闭游标’,‘执行语句’,‘返回行数’,‘接收全部’,其实主要的就是有个连接数据库的对象和创建一个光标的对象。
2.Flask-SQLAIchemy
安装:
pip install flask-sqlalchemy
1.对象-关系映射实质
示列:
mysql> create table tb_2(-> id int auto_increment primary key,-> user varchar(30) not null,-> password int(10) not null);
映射:
class Book(db.Model):__tablename__ = "book" #表名字id=db.Column(db.Integer ,primary_key=True,autoincrement=True) #列 类型 主键 自增title=db.Column(db.String(50),nullable=False) #列 类型 非空isbn=db.Column(db.String(20),nullable=False) #列 类型 非空
完整示列:
1.1首先创建一个配置文件,作为连接数据库的信息
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'demo-1'
USERNAME = 'root'
PASSWORD = 'root'DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".\format(username=USERNAME,password=PASSWORD, host=HOST,port=PORT, db=DATABASE)SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = True
1.2
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
import config
import pymysql
from datetime import datetime
app=Flask(__name__)
app.config.from_object(config)
db=SQLAlchemy(app) #捆绑,初始化一个对象class Book(db.Model):__tablename__ = "bookas" #表名字id=db.Column(db.Integer ,primary_key=True,autoincrement=True) #列 类型 主键 自增title=db.Column(db.String(50),nullable=False) #列 类型 非空isbn=db.Column(db.String(20),nullable=False) #列 类型 非空storage_time=db.Column(db.DateTime,default=datetime.now)
db.create_all() #创建数据库
@app.route('/')
def index():return '你好'
if __name__ == '__main__':app.run(debug=True)
1.3添加数据
@app.route('/add')
def add():book1=Book(id=3,title='php',isbn='1234569')book2=Book(id=4,title='c++',isbn='6543216')db.session.add_all([book1,book2]) #这是添加多个,db.session.add()一个一个添加db.session.commit() #提交事务return '添加数据成功'
1.4查询数据
@app.route('/query')
def selects():result=Book.query.filter(Book.id==1).first() #查询id==1的print(result.title) #输出title字段内容return '数据查询成功'
1.5删除数据
@app.route('/delete')
def delete():book_s=Book.query.filter(Book.id=='4').first()db.session.delete(book_s)db.session.commit()return '数据删除成功'
1.6创建一对一的关系表
import config
from flask_sqlalchemy import SQLAlchemy
from flask import Flaskapp = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)class User(db.Model):__tablename__ = 'user'id = db.Column(db.Integer, autoincrement=True, primary_key=True)username = db.Column(db.String(30), nullable=False) # 账号password = db.Column(db.String(40), nullable=False) # 密码phone = db.Column(db.String(11), nullable=False) # 电话email = db.Column(db.String(20), nullable=False)class Lib_card(db.Model):__tablename = 'lib_card'id = db.Column(db.Integer, autoincrement=True, primary_key=True)card_id = db.Column(db.Integer, nullable=False)paper_type = db.Column(db.String(50), nullable=False)user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 表示在这块表中创建一个外键users = db.relationship('User', backref=db.backref('cardss'), uselist=False) # 与主表绑定db.create_all()@app.route('/add')
def add():user1 = User(id=1, username='张三', password='11111', phone='1888888888', email='111@.01')user2 = User(id=2, username='张四', password='22222', phone='1777777777', email='2222@.02')db.session.add_all([user1, user2])card1 = Lib_card(id=1, card_id=1888000, paper_type='身份证', user_id=1)card2 = Lib_card(id=2, card_id=1999999, paper_type='身份证', user_id=2)db.session.add_all([card1, card2])db.session.commit()return ' 添加数据成功'
@app.route('/select')
def select():user=User.query.filter(User.username=='张四').first() #获得id=2art=user.cardss #通过cardss反向查询for k in art: print(k)print(k.card_id)card=Lib_card.query.filter(Lib_card.card_id).first()user=card.usersprint(user)print(user.username)return '查询数据成功后'@app.route('/')
def index():return '你好python'if __name__ == '__main__':app.run(debug=True)
个人说明:
在定义Lib_card类后,申明了一个外键,并且在relationship方法中使用了userlist=Flase来约束其关系,user_id=db.Column(db.Integer,db.ForeignKey('user.id'))表示创建一个外键,类型要和主表一样,通过db.ForeignKey('user.id')与主表绑定user=db.relationship('User,backref=db.backref('cards')');uselist=Flase 表示user可以根据Lib_card中的借书证号查找到用户表中的信息backref='cardss',表示用户可以直接通过cardss查找到该用户下的借书证号。
1.7创建一对多
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
app=Flask(__name__)
app.config.from_object(config)
db=SQLAlchemy(app)
class Writer(db.Model):__tablename__='writer'id=db.Column(db.Integer,autoincrement=True,primary_key=True)name=db.Column(db.String(30),nullable=False)books=db.relationship('Book',backref='writers') #让两张表关联class Book(db.Model):__tablename__='books'id=db.Column(db.Integer,autoincrement=True,primary_key=True)titel=db.Column(db.String(50),nullable=False)publishing_office=db.Column(db.String(100),nullable=False)isbn=db.Column(db.String(50),nullable=False)writer_id=db.Column(db.Integer,db.ForeignKey('writer.id')) #创建外键绑定主键db.create_all()@app.route('/add')
def add():user1=Writer(name='王麻子')user2=Writer(name='李老头')db.session.add_all([user1,user2])book1=Book(titel='python',publishing_office='清华大学出版社',isbn='987654321',writer_id=1)book2=Book(titel='JavaScript',publishing_office='人民邮电出版社',isbn='123456789',writer_id=2)db.session.add_all([book1,book2])db.session.commit()return '添加数据'@app.route('/select')
def select():writer=Writer.query.filter(Writer.id=='1').first()book=writer.booksfor i in book:print(i)print(i.titel)book=Book.query.filter(Book.id=='2').first()writer=book.writersprint(writer.name)return '查询数据'@app.route('/')
def index():return '首页'
if __name__ == '__main__':app.run(debug=True)
说明:
一对多取消掉了uselist=Flase,然后其实逻辑是主表查询子表需要调用backref=writers中的writers属性,子表查询父表需要调用books属性,relationship()使两个表进行关联,写在那个表都没关系,写在哪个表就要用头属性调用去查询另外一个表,没有写relationship()方法的表需要通过backref关键字属性去调用查询另外一个表。
1.8多对多关系
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import configapp = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
book_tag = db.Table('book_tag', db.Column('book_id', db.Integer, db.ForeignKey('book.id'), primary_key=True),db.Column('tag_id', db.Integer, db.ForeignKey('shelfing.id'), primary_key=True))
"""
Table()第一个参数为表名称,接着是表的字段类型,接着是设置外键
"""class Book(db.Model):__tablename__ = 'book'id = db.Column(db.Integer, primary_key=True, autoincrement=True)name = db.Column(db.String(30), nullable=False)tage = db.relationship('Shelfing', secondary=book_tag, backref=db.backref('books'))
"""
创建表
"""class Shelfing(db.Model):__tablename__ = 'shelfing'id = db.Column(db.Integer, primary_key=True, autoincrement=True)tag = db.Column(db.String(30), nullable=False)
"""
创建表
"""db.create_all()@app.route('/add')
def add():book1=Book(name='python')book2=Book(name='java')book3=Book(name='c++')tag1=Shelfing(tag='语言')tag2=Shelfing(tag='技术')tag3=Shelfing(tag='计算机')book1.tage.append(tag1)book2.tage.append(tag2)book3.tage.append(tag3)db.session.add_all([book1,book2,book3,tag1,tag2,tag3])db.session.commit()return '添加数据'
@app.route('/select')
def select():book=Book.query.filter(Book.name=='Java' ).first()tag=book.tagefor i in tag:print(i.tag)tag=Shelfing.query.filter(Shelfing.tag=='计算机').first()tags=tag.booksfor i in tags:print(i.name)return '查询数据'@app.route('/')
def index():return '首页'if __name__ == '__main__':app.run(debug=True)
python 数据库框架pyMysql+Flask -SQLAIchemy相关推荐
- Python数据库编程pymysql
Python数据库编程pymysql 一.数据库编程介绍 数据库编程就是针对数据库的操作,通过编写程序的方式,让程序做为数据库的客户端进行数据库操作. 对于MySQL的操作我们可以通过SQL语句,但是 ...
- Python常用框架:Flask
Flask框架的诞生: Flask诞生于2010年, Armin Ronacher的一个愚人节玩笑.不过现在已经是一个用python语言基于Werkzeug工具箱编写的轻量级web开发框架,它主要面向 ...
- python数据库框架_目前最受欢迎的12个Python开源框架
1 Django Django是一款用Python语言写的免费开源的 Python Web应用开发框架,它遵循模型 -视图-控制器(MVC)的架构模式.它是由非营利Django维护软件基金会(DSF) ...
- python 三大框架之一Flask入门
Flask轻量级框架,Flask是python中的轻量级框架. 打开终端 输入pip install Flask 命令 下载以及安装Flask框架 检查是否下载成功及能否使用 首先导入python环境 ...
- FastAPI - 一款新型的 Python Web 框架(对比 Flask)
近日曾想尽办法为 Flask 实现 Swagger UI 文档功能,找到的实现方式基本上是 Flask + Flasgger, 记录在 Flask 应用集成 Swagger UI.然而不断的 Goog ...
- python mysqldb安装_Flask干货:访问数据库——Python数据库框架MySQLPython
图 | 源网络文 | 5号程序员 上一次我们学会了数据库安装,但只是安装好没教大家怎么使用! 嘿,别担心,这不有我呢嘛. 今天就由我给大家介绍介绍框架MySQL-Python. 01 MySQL-Py ...
- python数据库框架_Python数据库及ORM框架对比选择
使用Python进行MySQL的库主要有三个: Python-MySQL(更熟悉的名字可能是MySQLdb), PyMySQL SQLAlchemy. Python-MySQL: 资格最老,核心由C语 ...
- python后端框架flask_Vue+Flask轻量级前端、后端框架,如何完美同步开发
导言我们的Vue2.0应用:简读-微信公众号RSS,即将进入后端开发. Vue+Flask作为轻量级前端.后端框架,非常适合组合起来快速开发.一个是js,一个是Python. Bonus: 可以完美实 ...
- python数据库操作pymysql
安装数据库: pip3 install pymysql 进行数据库的更新.插入.查询等操作: 1 #!/usr/bin/python3.4 2 # -*- coding: utf-8 -*- 3 4 ...
最新文章
- R语言plotly包可视化线图(line plot)、使用restyle参数自定义设置可视化结果中线条的颜色、使用按钮动态切换线条的颜色(change line color with button)
- TCP/IP详解--学习笔记(8)-DNS域名系统
- 保定理工学院专科计算机专业分数线,保定理工学院历年分数线 2021保定理工学院录取分数线...
- 来自开发者的点赞 · 网易云信揽获三大技术奖项
- cmake-debug和release模式
- http响应协议分析
- Django(part8)--响应及HttpResponse对象
- noip2012-day2-t2
- Scala学习笔记05:函数
- Ajax学习总结(2)——Ajax参数详解及使用场景介绍
- 虚拟机安装ubuntu18.04及其srs服务器的搭建
- VS2005查找功能没法使用
- intel hd3000 本 在 64位 ubuntu10.04 下 液晶亮度无法调节 的解决之道(亲测)
- 学习 STM32之九轴姿态传感器(BWT901CL)串口通信读取数据
- android 使用signingConfigs进行打包
- 自己制作的直流电机驱动器
- 快速生成CRUD接口的神器-IDEA插件EasyCode
- 【《Real-Time Rendering 3rd》提炼总结】完结篇:系列合集电子书PDF下载实时渲染知识网络图谱新系列预告
- 线上发版如何做到分批发的?详解蓝绿部署,滚动升级,A/B 测试,灰度发布/金丝雀发布
- 纯CSS+HTML+JS实现的简易个人网站