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 Flask

app = 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=2
    art=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.users
    print(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.books
    for i in book:
        print(i)
        print(i.titel)
    book=Book.query.filter(Book.id=='2').first()
    writer=book.writers
    print(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 config

app = 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.tage
    for i in tag:
        print(i.tag)

    tag=Shelfing.query.filter(Shelfing.tag=='计算机').first()
    tags=tag.books
    for i in tags:
        print(i.name)

    return '查询数据'


@app.route('/')
def index():
    return '首页'


if __name__ == '__main__':
    app.run(debug=True)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值