参考文档 https://www.ctolib.com/topics-96759.html
文章目录
- 1 简介
- 2 简单操作实例
- 3 详细操作解释【这部分内容还没有时间很细节地查看】
-
- 3.1 创建链接引擎 Create Engine
- 3.2 声明映射关系 Declare a Mapping
- 3.3 元数据定义【最小结构】
- 3.4 执行命令创建数据表
- 3.5 元数据定义【完整版】
- 创建映射类的实例 Create an Instance of the Mapped Class
- 创建会话 Creating a Session
- 添加/更新对象 保存到 seesion中(Adding and Updating Objects)
- 回滚(Rolling Back)
- 查询(Quering)
- 常用过滤操作(Common Filter Operators)
- 查询返回的列表以及标量(Returning Lists and Scalars)
- 使用SQL语句查询(Using Textual SQL)
- 计数(Counting)
1 简介
1.1 对象关系映射 ORM
SQLAlchemy
是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具。对象关系映射 用户使用Python定义的类 与 数据库中的表相关联的一种方式,类的实例则对应数据表中的一行数据,对应关系如下:
SQLAlchemy | SQL |
---|---|
Python定义类 | 数据表 |
类的实例 | 行数据 |
SQLAlchemy包括了一套 将对象中的变化同步到数据库表中 的系统,这套系统被称之为工作单元(unit of work),同时也提供了 使用类查询来实现数据库查询 以及 查询表之间关系 的功能。
1.2 版本检查
检查当前使用的 SQLAlchemy 的版本,可能存在版本不一样结果有偏差的情况,本质上原理基本一致的
In [1]: import sqlalchemy
In [2]: sqlalchemy.__version__
Out[2]: '1.2.1'
2 简单操作实例
2.1 数据库 增删查改
# 导入相关数据包
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine, Column, Integer, String, equence
engine = create_engine('sqlite:///test.db', echo=True)
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
name = Column(String(50))
fullname = Column(String(50))
password = Column(String(12))
def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (self.name, self.fullname, self.password)
Base.metadata.create_all(engine)
# 实例化一个对象,并赋值
ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
# 创建会话链接,并关联引擎
Session = sessionmaker(bind=engine)
# 创建一个session实例
session = Session()
# 将数据添加到seesion中
2.2 seesion内的高级操作
3 详细操作解释【这部分内容还没有时间很细节地查看】
3.1 创建链接引擎 Create Engine
这篇教程中我们使用sqlite数据库来演示操作,我们使用create_engine()
来连接需要操作的数据库:
# 注意: 这里需要先新建一个 sqlite 的本地数据库文件
# PS C:\Users\Administrator> sqlite3 test.db
In [3]: from sqlalchemy import create_engine
In [4]: engine = create_engine('sqlite:///test.db', echo=True)
echo
参数是用来设置SQLAlchemy日志的,通过Python标准库logging模块实现。设置为True的时候我们可以看见所以的操作记录。如果你在按照本教程进行学习,那么你可以将它设置为False来减少日志的输出。
create_engine()
的返回值是Engine
的一个实例,此实例代表了操作数据库的核心接口,通过方言来处理数据库和数据库的API。在本例中,SQLite方言将被翻译成Python内置的sqlite3模块(个人理解,方言指的是每一种数据库的使用的方言,比方说mysql会有一种,sqlite又会有一种,而每种语言又会有很多在数据库的处理模块,比方说刚刚提到的Python内置的sqlite3模块)。
当第一次调用 Engine.execute()
或者 Engine.connect()
这种方法的时候,引擎(Engine)会和数据库建立一个真正的DBAPI连接,用来执行SQL语句。但是在创建了连接之后,我们很少直接使用Engine来操作数据库,更多的会使用ORM这种方式来操作数据库,这种方式在下面我们会看见具体的例子。
3.2 声明映射关系 Declare a Mapping
当使用 ORM 的时候,配置过程以描述数据库的表来开始,然后我们定义与之匹配的类。在现在的 SQLAlchemy 中,这两个过程一般结合在一起,通过一个称之为声明(Declarative)的系统实现。这个系统帮我们定义类以及实现与表的对应。
声明系统实现类与表的对应是通过一系列基类实现的—即声明基类(declarative base class)。我们的应用程序经常只有一个此基类的示例。使用declarative_base()
函数,如下:
In [5]: from sqlalchemy.ext.declarative import declarative_base
In [6]: Base = declarative_base()
有了 Base
之后,我们可通过他定义任何数量的映射类。我们以一个 User表
来开始这个教程,User表
记录了用我们应用的终端用户的信息。与之对应的类称之为User
。表的信息包括表名,姓名,还有列的数据类型,如下:
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (self.name