「Flask笔记」 sql基本操作

栏目: Python · 发布时间: 5年前

内容简介:连接数据库这里使用配置文件的方法返回结果打印一个(1,),链接数据库成功

数据库选择mysql,先安装相关的包

在虚拟环境下运行

pip3 install SQLAlchemy

pip3 install pymysql

连接数据库

连接数据库

这里使用配置文件的方法返回

#setting.py
def conn():
    HOSTNAME = '127.0.0.1'
    DATABASE = '<a href="https://www.miaoroom.com/tag/flask" data-toggle="tooltip" title="查看更多关于 flask 的文章" target="_blank">flask</a>'
    PORT = '3306'
    USERNAME = 'root'
    PASSWORD = 'root'

    DB_URL = "mysql+pymysql://{username}:{password}@{host}:{port}/{database}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,database=DATABASE)

    return DB_URL
from sqlalchemy import create_engine

import setting

DB_URL = setting.conn()
engine = create_engine(DB_URL)

conn = engine.connect()
result = conn.execute('select 1')
print(result.fetchone()) #(1,)

结果打印一个(1,),链接数据库成功

SQLAlchemy ORM模型

1.ORM Object Relationship Mapping

2.模型与表之间的映射

SQLAlchemy

采用写原生sql的方式在代码中会出现大量的sql语句,会出现一些问题:

sql语句重复利用率不高,越复杂的sql语句条件越多,代码越长。会出现很多相近的sql语句

很多sql语句是在业务逻辑中拼出来的,如果有数据库需要更改,就要去修改这些逻辑,这会很容易漏掉对某些sql语句的修改。

写sql时容易忽略web安全问题,给未来造成隐患

ORM,全称Object Relational Mapping,中文叫做对象关系映射,通过ORM可以通过类的方式去操作数据库,而不用再写原生的sql语句。通过把表映射成类,把行作实例,把字段作为属性,ORM在执行对象操作的时候最终还是会把对象的操作转换为数据库原生语句。使用ORM有许多有点:

易用性:使用ORM做数据库的开发可以有效的减少重复sql语句的概率,写出来的模型也更加直观清晰。

性能损耗小:ORM转换成底层数据库操作指令确实会有一些开销。但从实际的情况来看,这种性能损耗很少,只要不是对性能有严格的要求,综合考虑开发效率,代码的阅读性,带来的好处要远大于性能损耗,而且项目越大作用越明显。

设计灵活:可以轻松的写出复杂的查询

可移植性:SQLAlchemy封装了底层的数据库实现,支持多个关系数据库引擎,包括流行的 MySQL 、PostgreSQL和SQLite。可以非常轻松的切换数据库

使用SQLAlchemy创建数据表

from sqlalchemy import create_engine,Column,Integer,String #导入模块,表的数据类型
from sqlalchemy.ext.declarative import declarative_base #用来返回一个基类
import setting

class Sql(Base):
    __tablename__ = 'sql_test'
    id = Column(Integer,primary_key=True,autoincrement=True)
    text = Column(String(20))
    name = Column(String(20))

Base.metadata.create_all()

运行后sql命令行里查看结果,成功创建数据表

实现增删改查

from sqlalchemy import create_engine,Column,Integer,String
from sqlalchemy.orm import sessionmaker
import setting

DB_URL = setting.conn()
engine = create_engine(DB_URL)

Session = sessionmaker(engine)()  #在sessionmaker种实现了 python 的__call__魔术方法,调用的时候返回一个可调用的对象,然后返回他的基类

def add_data():
    data = Sql(text='i want flag',name='fl4g') #前面创建的数据表类
    Session.add(data)
    Session.commit()
# 添加多条
def add_more_data():
    data1 = Sql(text='i want flag',name='fl4g')
    data2 = Sql(text='i want flag too',name='f1ag')
    Session.add_all([data1,data2]) #提交一个列表,并且要使用add_all方法
    Session.commit()

为了更好的查看效果,可以在上面创建的类种实现 __str__ 魔术方法,即当对象被直接调用的时候,执行里面的代码

def __str__(self):
    return "<data(id:%s,text:%s,name:%s)>" % (self.id,self.text,self.name)
#查找所有
def search_data():
    all_data=Session.query(Sql).all()
    for q in all_data:
        print(q)
#按条件查找 使用filter_by
def search_data():
    all_data=Session.query(Sql).filter_by(name='fl4g').all()
    for q in all_data:
        print(q)
#按条件查找 使用filter
def search_data():
    all_data=Session.query(Sql).filter(Sql.name=='fl4g').all() #这里不能使用关键字参数
    for q in all_data:
        print(q)
#使用get方法查找,get方法十根据id来查找的,只会返回一条数据或者None
def search_data():
    all_data=Session.query(Sql).get(primary_key)
    for q in all_data:
        print(q)

def delete_data():
    data = Session.query(Sql).first()  #选择第一条数据
    Session.delete(data)
    Session.commit()

def update_data():
    data = Session.query(Sql).first()
    Session.name = 'f14g'
    Session.commit()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

特别版MATHEMATICA全书

特别版MATHEMATICA全书

[美] 斯蒂芬·沃尔夫雷 / 赫孝良、周义仓 / 西安交通大学出版社 / 2002-1 / 60.00元

一起来看看 《特别版MATHEMATICA全书》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码