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)