SQLAlchemy介绍
SQLAlchemy是python中最著名的ORM框架,在著名的云计算平台OpenStack中,该ORM框架被大量应用。本文对如何使用SQLAlchemy库进行简要介绍。安装该框架可以直接使用pip命令即可,这里不再赘述。本文介绍,如何利用SQLAlchemy向MySQL数据库中插入数据和查询数据。
涉及Python类以及源码实现
利用SQLAlchemy库实现ORM,主要需要创建两种类,一种是Model类,用于明确对象与与数据库表格的关系,一种是API类,用于对Model类的实例(对应数据库表格中的一行记录)进行插入和查询。比如,如果需要在MySQL中的food
数据库保存一个表,表名为fruit
,那么首先确保在MySQL数据库中存有food
数据库,执行以下命令
create database food;
为使用SQLAlchemy库,需要安装以下包:
pip install sqlalchemy, mysql-connector-python
然后创建models.py
文件,定义Model类:
from sqlalchemy import Column, String, Integer, Float
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
###################################################################
#
# Models defining the Mysql tables used to store information
#
##################################################################
class Fruit(Base):
__tablename__ = 'fruit' # 对应表格的名字
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(31), nullable=False)
price = Column(Float, nullable=False)
# 通过table的名字查询到对应的Model类
table_map = {
'fruit': Fruit
}
接着,创建api.py
文件创建API类
import models as models
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
class DbAPI:
def __init__(self):
self.__db_name = 'food'
self.__db_vendor = 'mysql'
self.__username = $数据库用户名$
self.__password = $数据库密码$
self.engine = self.create_eng()
# 调用此函数将创建全部数据库表格
models.Base.metadata.create_all(self.engine)
self.__session = sessionmaker(bind=self.engine)()
def create_eng(self):
if self.__db_vendor == 'mysql':
return create_engine('mysql+mysqlconnector://%s:%s@localhost:3306/%s?charset=utf8' %
(self.__username, self.__password, self.__db_name))
else:
raise NotImplementedError
def close_session(self):
'''
调用此函数断开与数据库连接
'''
self.__session.close()
#######################################################################
#
# General DB APIs
#
#######################################################################
def insert_objs(self, db_objs):
'''
此函数用于向数据库表格中插入多个record
db_objs: Model类(例如Fruit)实例的list
'''
for db_obj in db_objs:
self.__session.add(db_obj)
self.__session.commit()
def retrieve_query(self, table_name, fields=None):
try:
db_model = models.table_map[table_name] # 表格对应的Model类
except KeyError:
return None
query_fields = []
if fields is not None:
for f in fields:
db_field = getattr(db_model, f, None)
if db_field is not None:
query_fields.append(db_field)
if len(query_fields) > 0:
query = self.__session.query(*query_fields) # 查询特定的字段
else:
query = self.__session.query(db_model) # 返回全部字段
return query.filter()
通过调用上述两个类,创建main
函数,就可以将fruit
表格插入到food
数据库中,并插入一条记录:
from models import Fruit
from api import DbAPI
if __name__ == '__main__':
f = Fruit()
f.name = 'apple'
f.price = 10.0
f_list = list()
f_list.add(f)
dbapi = DbAPI()
dbapi.insert_objs(f_list)
dbapi.close_session()
查看数据库内容: