数据库选择mysql,先安装相关的包
在虚拟环境下运行
pip3 install SQLAlchemy
pip3 install pymysql
连接数据库
连接数据库
这里使用配置文件的方法返回
#setting.py
def conn():
HOSTNAME = '127.0.0.1'
DATABASE = 'flask'
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()