连接数据库(MysqL)得语句: 语法:MysqL+pyMysqL://用户名:密码@ip:端口/数据库名
增删改查小练习
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
# 连接数据库
# 地址
from sqlalchemy.ext.declarative import declarative_base
HOSTNAME = '127.0.0.1'
# 数据库名字
DATABASE = 'iloveyou'
# 端口
PORT = 3306
# 用户名和密码
USERNAME = 'root'
PASSWORD = '123456'
DB_URL = f'MysqL+pyMysqL://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}'
engine = create_engine(DB_URL)
# 都要继承这个函数生成的基类
# 创建基类
Base = declarative_base(engine)
# 创建类
class Dj(Base):
__tablename__ = 'dj'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(225), nullable=False)
content = Column(String(225), nullable=False)
gender = Column(Integer, nullable=False, default=1, comment='1为男, 2为女')
# 魔术方法
def __str__(self):
return f'name:{self.name},contentL{self.content},gender:{self.gender}'
# 模型映射到数据库中
# Base.Metadata.create_all()
# 和游标感觉差不多
Session = sessionmaker(bind=engine)
session = Session()
# 增
def add_data():
article = Dj(name='python', content='人生苦短,我用python', gender=1)
session.add_all([article])
session.commit()
# 查
def select_data():
# 查询第一条数据
data = session.query(Dj).first()
print(data)
# get更好
data = session.query(Dj).get(1)
print(data)
print('****************')
data = session.query(Dj).all()
for item in data:
print(item)
# filter条件查询
print('-----------------')
data = session.query(Dj).filter(Dj.name == 'java').all()
for item in data:
print(item)
# filter_by
print('-----------------')
data = session.query(Dj).filter_by(name='python').all()
for item in data:
print(item)
# 修改
def update_data():
data = session.query(Dj).first()
data.name = 'c++'
session.commit()
# 删除
def delete_data():
data = session.query(Dj).first()
session.delete(data)
session.commit()
if __name__ == '__main__':
# add_data()
# select_data()
# update_data()
delete_data()
运用的一些数据类型和约束
"""
Integer:整形。
Float:浮点类型。
Boolean:传递True/False进去。
DECIMAL:定点类型。 # (number, 精度)
enum:枚举类型。
Date:传递datetime.date()进去。
DateTime:传递datetime.datetime()进去。
Time:传递datetime.time()进去。
String:字符类型,使用时需要指定长度,区别于Text类型。
Text:文本类型。
LONGTEXT:长文本类型。
"""
"""
高级查询
imit、offset和切片
• limit:可以限制每次查询的时候只查询几条数据。
• offset:可以限制查找数据的时候过滤掉前面多少条。
• 切片:可以对Query对象使用切片操作,来获取想要的数据。
1.order_by:可以指定根据这个表中的某个字段进行排序,如果在前面加了一个-,代表的是降序排序。
2.group_by根据某个字段进行分组。比如想要根据性别进行分组,来统计每个分组分别有多少人
3.having是对查找结果进一步过滤。比如只想要看未成年人的数量,那么可以首先对年龄进行分组统计人数,然后再对分组进行having过滤。
"""
'''
• default:默认值。
• nullable:是否可空。
• primary_key:是否为主键。
• unique:是否唯一。
• autoincrement:是否自动增长。
• onupdate:更新的时候执行的函数。
• name:该属性在数据库中的字段映射
'''
重头戏来了 Flask-sqlAlchemy插件
Flask-sqlAlchemy插件
另外一个框架,叫做Flask-sqlAlchemy,Flask-sqlAlchemy是对sqlAlchemy进行了一个简单的封装,使得我们在flask中使用sqlalchemy更加的简单。可以通过pip install flask-sqlalchemy。
• 数据库初始化:数据库初始化不再是通过create_engine
from flask import Flask
from flask_sqlalchemy import sqlAlchemy
from constants import DB_URI
app = Flask(__name__)
app.config['sqlALCHEMY_DATABASE_URI'] = DB_URI
db = sqlAlchemy(app)
• ORM类:之前都是通过Base = declarative_base()来初始化一个基类,然后再继承,在Flask-sqlAlchemy中更加简单了
class User(db.Model):
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(80),unique=True)
email = db.Column(db.String(120),unique=True)
def __repr__(self):
return '<User %s>' % self.username
• 映射模型到数据库表:使用Flask-sqlAlchemy所有的类都是继承自db.Model,并且所有的Column和数据类型也都成为db的一个属性。但是有个好处是不用写表名了,Flask-sqlAlchemy会自动将类名小写化,然后映射成表名。
写完类模型后,要将模型映射到数据库的表中,使用以下代码创建所有的表:
db.create_all()
• 添加数据:这时候就可以在数据库中看到已经生成了一个user表了。
admin = User('admin','[email protected]')
guest = User('guest','[email protected]')
db.session.add(admin)
db.session.add(guest)
db.session.commit()
• 添加数据和之前的没有区别,只是session成为了一个db的属性。
• 查询数据:查询数据不再是之前的session.query了,而是将query属性放在了db.Model上,所以查询就是通过Model.query的方式进行查询了
users = User.query.all()
• 删除数据:删除数据跟添加数据类似,只不过session是db的一个属性而已:
db.session.delete(admin)
db.session.commit()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。