这篇文章给大家介绍怎么在Python 中使用SQLAlchemy操作数据库,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和float(浮点型)。2.字符串,分别是str类型和unicode类型。3.布尔型,Python布尔类型也是用于逻辑运算,有两个值:True(真)和False(假)。4.列表,列表是Python中使用最频繁的数据类型,集合中可以放任何数据类型。5. 元组,元组用”()”标识,内部元素用逗号隔开。6. 字典,字典是一种键值对的集合。7. 集合,集合是一个无序的、不重复的数据组合。
SQLAlchemy 简介
SQLAlchemy 是一个功能强大的开源 Python ORM 工具包。它提供了 “一个知名企业级的持久化模式的,专为高效率和高性能的数据库访问设计的,改编成一个简单的 Python 域语言的完整套件”。它采用了数据映射模式(像 Java 中的 Hibernate)而不是 Active Record 模式(像Ruby on Rails 的 ORM)。
SQLAlchemy官网。
SQLAlchemy 的优缺点:
优点:
企业级 API,使得代码有健壮性和适应性。
灵活的设计,使得能轻松完成复杂的数据查询。
缺点:
工作单元概念不常见。
重量级 API,导致长学习曲线。
SQLAlchemy 应用
以下是一段使用 SQLAlchemy 操作 SQLite 数据库的代码
# -*- coding:utf-8 -*- from sqlalchemy import ( create_engine, Column, Integer, String, ) from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker engine = create_engine('sqlite:///./sqlalchemy.sqlite', echo=True) Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String) fullname = Column(String) nickname = Column(String) def __repr__(self): return "<User(name='%s', fullname='%s', nickname='%s')>" % (self.name, self.fullname, self.nickname) db_session = sessionmaker(bind=engine) session = db_session() Base.metadata.create_all(engine) user1 = User(name='ed', fullname='Ed Jones', nickname='edsnickname') user2 = User(name='wendy', fullname='Wendy Williams', nickname='windy') user3 = User(name='mary', fullname='Mary Contrary', nickname='mary') session.add(user1) session.add(user2) session.add(user3) session.commit() user = session.query(User).filter(User.id<2).all() print(user) user = session.query(User).filter(User.id<=5).all() print(user) user1.name = 'admin' session.merge(user1) user4 = User(name='fred', fullname='Fred Flintstone', nickname='freddy') session.merge(user4) session.query(User).filter(User.id==2).update({'name':'test'}) user = session.query(User).filter(User.id<=5).all() print(user)
在以上代码中我们完成了一下工作:
连接到数据库「本次我们使用的是 SQLite 数据库」。
创建数据库表并将其映射到 Python 类上。
创建数据实例,并将其保存到数据库中。
对保存在数据库中的数据进行读取和修改。
导入 SQLAlchemy 模块并连接到 SQLite 数据库
SQLAlchemy 通过 create_engine 函数来创建数据库连接。create_engine 函数的第一个参数是数据了 URL,第二个参数 echo 设置为 True 表示在程序的运行过程中我们可以在控制台看到操作所涉及到的 SQL 语句。
在本次示例中我们使用的数据库是 SQLite,你也可以使用其他数据库。只有在调试状态下将 echo 设置为 True,在生产环境请将 echo 设置为 false 或省略 echo 参数。
engine = create_engine('sqlite:///./sqlalchemy.sqlite', echo=True)
create_engine 返回的是一个 Engine 实例,它指向数据库的一些核心接口。SQLAlchemy会根据你选择的数据库配置而调用对应的 DB-API。
create_engine 函数并会不真正建立数据库的 DB-API 连接,当调用 Engine.execute() 或 Engine.connect() 方法时才会建立连接。大多数情况下我们无需关注 Engine,SQLAlchemy 会帮我们处理。
创建数据库表
将 python 类映射到数据库表上,这个 Python 类需要时一个指定基类的子类,这个基类应当含有ORM映射中相关的类和表的信息。这个基类可以通过 declarative_base 方法来创建。
Base = declarative_base()
在这个示例中使用 Base 基类创建了一个 User 的类来作为数据库表。
class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String) fullname = Column(String) nickname = Column(String) def __repr__(self): return "<User(name='%s', fullname='%s', nickname='%s')>" % (self.name, self.fullname, self.nickname)
在 User 类中我们定义了需要映射到数据库表上的属性,主要包括表名称、列的类型和名称等。这个类至少应包含一个名为 tablename 的属性来给出数据库表的名称,及至少一个给出表的主键「primary key」的列。在 User 类中我们定义了表名称为 users,定义了 id、name、fullname、nickname 四列数据,并设置 id 为表的主键。
创建完成 User 类后,实际在 SQLite 数据库中并不存在该表,此时需要使用 declarative 基类的 Metadata.create_all 在数据库中创建 users 表,在 create_all 方法中我们需要传入参数 Engine。
通过 Metadata.create_all 传入的 Engine 参数,SQLAlchemy 自动实现对数据库的连接。
Base.metadata.create_all(engine)
metadata.create_all 方法执行完成后在 SQLite 数据库即可查到名称为 users 的数据表。
保存数据实例到数据库中
将数据保存到数据库中,我们需要 User 的实例和用于操作数据的 session。
session 是 ORM 数据的接口,可以通过 session 来操作数据库中的数据。
使用已经定义完成的 User 类将数据实例化。
user1 = User(name='ed', fullname='Ed Jones', nickname='edsnickname') user2 = User(name='wendy', fullname='Wendy Williams', nickname='windy') user3 = User(name='mary', fullname='Mary Contrary', nickname='mary')
获取 session 首先需要使用 sessionmaker 来得到 session 的工厂类,然后通过工厂类来获取 session。
db_session = sessionmaker(bind=engine) session = db_session()
session 通过 Engine 与数据库进行关联。session 创建完成后并不会立即打开与数据库的连接,只有当我们第一使用 session 是,才会从 Engine 维护的连接池中取出一个连接来操作数据库,这个连接在我们关闭 session 时会被释放。
获取 session 后可以通过 add 和 commit 方法将数据保存到数据库中。
session.add(user1) session.add(user2) session.add(user3) session.commit()
对数据库中的数据进行查询和修改
SQLAlchemy 通过 query 来对数据进行查询,可以通过 filter 方法对查询结果进行筛选。
user = session.query(User).filter(User.id<2).all() print(user) user = session.query(User).filter(User.id<=5).all() print(user)
以上代码通过 query 获取数据库中所有 User 数据,然后通过 filter 方法筛选出 id 小于 2 和 id 小于等于 5 的数据。
数据库的修改可以通过 merge 和 update 来实现
user1.name = 'admin' session.merge(user1) user4 = User(name='fred', fullname='Fred Flintstone', nickname='freddy') session.merge(user4) session.query(User).filter(User.id==2).update({'name':'test'}) user = session.query(User).filter(User.id<=5).all() print(user)
使用 merge 修改数据,当数据中存在该数据时修改,不存在是将当前数据插入数据库中。
代码运行结果
以上示例代码的运行结果如下
2019-02-16 21:45:23,919 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1 2019-02-16 21:45:23,919 INFO sqlalchemy.engine.base.Engine () 2019-02-16 21:45:23,919 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1 2019-02-16 21:45:23,919 INFO sqlalchemy.engine.base.Engine () 2019-02-16 21:45:23,920 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("users") 2019-02-16 21:45:23,920 INFO sqlalchemy.engine.base.Engine () 2019-02-16 21:45:23,921 INFO sqlalchemy.engine.base.Engine CREATE TABLE users ( id INTEGER NOT NULL, name VARCHAR, fullname VARCHAR, nickname VARCHAR, PRIMARY KEY (id) ) 2019-02-16 21:45:23,921 INFO sqlalchemy.engine.base.Engine () 2019-02-16 21:45:23,922 INFO sqlalchemy.engine.base.Engine COMMIT 2019-02-16 21:45:23,924 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) 2019-02-16 21:45:23,925 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, nickname) VALUES (?, ?, ?) 2019-02-16 21:45:23,925 INFO sqlalchemy.engine.base.Engine ('ed', 'Ed Jones', 'edsnickname') 2019-02-16 21:45:23,926 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, nickname) VALUES (?, ?, ?) 2019-02-16 21:45:23,926 INFO sqlalchemy.engine.base.Engine ('wendy', 'Wendy Williams', 'windy') 2019-02-16 21:45:23,926 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, nickname) VALUES (?, ?, ?) 2019-02-16 21:45:23,926 INFO sqlalchemy.engine.base.Engine ('mary', 'Mary Contrary', 'mary') 2019-02-16 21:45:23,927 INFO sqlalchemy.engine.base.Engine COMMIT 2019-02-16 21:45:23,929 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) 2019-02-16 21:45:23,929 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.nickname AS users_nickname FROM users WHERE users.id < ? 2019-02-16 21:45:23,929 INFO sqlalchemy.engine.base.Engine (2,) [<User(name='ed', fullname='Ed Jones', nickname='edsnickname')>] 2019-02-16 21:45:23,931 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.nickname AS users_nickname FROM users WHERE users.id <= ? 2019-02-16 21:45:23,931 INFO sqlalchemy.engine.base.Engine (5,) [<User(name='ed', fullname='Ed Jones', nickname='edsnickname')>, <User(name='wendy', fullname='Wendy Williams', nickname='windy')>, <User(name='mary', fullname='Mary Contrary', nickname='mary')>] 2019-02-16 21:45:23,932 INFO sqlalchemy.engine.base.Engine UPDATE users SET name=? WHERE users.id = ? 2019-02-16 21:45:23,932 INFO sqlalchemy.engine.base.Engine ('admin', 1) 2019-02-16 21:45:23,933 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, nickname) VALUES (?, ?, ?) 2019-02-16 21:45:23,933 INFO sqlalchemy.engine.base.Engine ('fred', 'Fred Flintstone', 'freddy') 2019-02-16 21:45:23,934 INFO sqlalchemy.engine.base.Engine UPDATE users SET name=? WHERE users.id = ? 2019-02-16 21:45:23,934 INFO sqlalchemy.engine.base.Engine ('test', 2) 2019-02-16 21:45:23,935 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.nickname AS users_nickname FROM users WHERE users.id <= ? 2019-02-16 21:45:23,935 INFO sqlalchemy.engine.base.Engine (5,) [<User(name='admin', fullname='Ed Jones', nickname='edsnickname')>, <User(name='test', fullname='Wendy Williams', nickname='windy')>, <User(name='mary', fullname='Mary Contrary', nickname='mary')>, <User(name='fred', fullname='Fred Flintstone', nickname='freddy')>]
由于我们设置 create_engine 中 echo 为 True,因此在执行结果中包含了 SQLAlchemy 打印的 SQL 语句,我们可以取消 crete_engine 中的 echo
engine = create_engine('sqlite:///./sqlalchemy.sqlite')
此时的执行结果如下:
[<User(name='ed', fullname='Ed Jones', nickname='edsnickname')>] [<User(name='ed', fullname='Ed Jones', nickname='edsnickname')>, <User(name='wendy', fullname='Wendy Williams', nickname='windy')>, <User(name='mary', fullname='Mary Contrary', nickname='mary')>] [<User(name='admin', fullname='Ed Jones', nickname='edsnickname')>, <User(name='test', fullname='Wendy Williams', nickname='windy')>, <User(name='mary', fullname='Mary Contrary', nickname='mary')>, <User(name='fred', fullname='Fred Flintstone', nickname='freddy')>]
关于怎么在Python 中使用SQLAlchemy操作数据库就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。