PythonSQLAlchemy⼊门教程(基本⽤法)
本⽂将以Mysql举例,介绍sqlalchemy的基本⽤法。其中,Python版本为2.7,sqlalchemy版本为1.1.6。
⼀. 介绍
SQLAlchemy是Python中最有名的ORM⼯具。
关于ORM:
全称Object Relational Mapping(对象关系映射)。
特点是操纵Python对象⽽不是SQL查询,也就是在代码层⾯考虑的是对象,⽽不是SQL,体现的是⼀种程序化思维,这样使得Python程序更加简洁易读。
具体的实现⽅式是将数据库表转换为Python类,其中数据列作为属性,数据库操作作为⽅法。
优点:
简洁易读:将数据表抽象为对象(数据模型),更直观易读
可移植:封装了多种数据库引擎,⾯对多个数据库,操作基本⼀致,代码易维护
更安全:有效避免SQL注⼊
为什么要⽤sqlalchemy?
虽然性能稍稍不及原⽣SQL,但是操作数据库真的很⽅便!
⼆. 使⽤
概念和数据类型
概念
概念对应数据库说明
Engine连接驱动引擎
Session连接池,事务由此开始查询
Model表类定义
Column列
Query若⼲⾏可以链式添加多个条件
常见数据类型
数据类型数据库数据类型python数据类型说明
Integer int int整形,32位
String varchar string字符串
Text text string长字符串
Float float float浮点型
Boolean tinyint bool True / False
Date date datetime.date存储时间年⽉⽇
DateTime datetime datetime.datetime存储年⽉⽇时分秒毫秒等
Time time datetime.datetime存储时分秒
创建数据库表
1.安装
pip install SQLalchemy
2. 创建连接
from sqlalchemy import create_engine
engine = create_engine("mysql://user:password@hostname/dbname?charset=uft8")
这⾏代码初始化创建了Engine,Engine内部维护了⼀个Pool(连接池)和Dialect(⽅⾔),⽅⾔来识别具体连接数据库种类。
创建好了Engine的同时,Pool和Dialect也已经创建好了,但是此时并没有真正与数据库连接,等到执⾏具体的语句.connect()等时才会连接到
数据库。
create_engine还有其它可选的参数,⽐如:
engine = create_engine("mysql://user:password@hostname/dbname?charset=uft8",
补水眼霜哪个牌子好echo=True,
pool_size=8,
pool_recycle=60*30
)
echo: 当设置为True时会将orm语句转化为sql语句打印,⼀般debug的时候可⽤
pool_size: 连接池的⼤⼩,默认为5个,设置为0时表⽰连接⽆限制
pool_recycle: 设置时间以限制数据库多久没连接⾃动断开
3. 创建数据库表类(模型)
前⾯有提到ORM的重要特点,那么我们操作表的时候就需要通过操作对象来实现,现在我们来创建⼀个类,以常见的⽤户表举例:
古装剧大全
declarative import declarative_base
Base = declarative_base()
class Users(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String(64), unique=True)
email = Column(String(64))
def __init__(self, name, email):
self.name = name
declarative_base()是sqlalchemy内部封装的⼀个⽅法,通过其构造⼀个基类,这个基类和它的⼦类,可以将Python类和数据库表关联映射起来。
数据库表模型类通过__tablename__和表关联起来,Column表⽰数据表的列。
4. ⽣成数据库表
创建表,如果存在则忽略,执⾏以上代码,就会发现在db中创建了users表。
操作数据
表创建好了就是操作数据了,常见的操作增删改查,我们⼀⼀介绍。
刑事拘留一般多少天session
sqlalchemy中使⽤session⽤于创建程序和数据库之间的会话,所有对象的载⼊和保存都需要通过session对象。
通过sessionmaker调⽤创建⼀个⼯⼚,并关联Engine以确保每个session都可以使⽤该Engine连接资源:
import sessionmaker
# 创建session
DbSession = sessionmaker(bind=engine)
session = DbSession()
session的常见操作⽅法包括:
flush:预提交,提交到数据库⽂件,还未写⼊数据库⽂件中
commit:提交了⼀个事务
rollback:回滚
close:关闭
举个最简单的例⼦:
add_user = Users("test", "test123@qq")
session.add(add_user)
sessionmit()
session.add()将会把Model加⼊当前session维护的持久空间(可以从session.dirty看到)中,直到commit时提交到数据库。
Q1:add之后如何直接返回对象的属性?
可以在add之后执⾏db.session.flush(),这样便可在session中get到对象的属性。
Q2:如何进⾏批量插⼊,性能⽐较?
批量插⼊共有以下⼏种⽅法,对它们的批量做了⽐较,分别是:
session.add_all() < bulk_save_object() < bulk_insert_mappings() < SQLAlchemy_core()
查询是最常⽤的⼀个操作了,举个最简单的查询例⼦:
users = session.query(Users).filter_by(id=1).all()
for item in users:
print(item.name)
通常我们通过以上查询模式获取数据,需要注意的是,通过session.query()我们查询返回了⼀个Query对象,此时还没有去具体的数据库中查询,只有当执⾏具体的.all(),.first()等函数时才会真的去操作数据库。
其中,query有filter和filter_by两个过滤⽅法,上述例⼦也可写为:
users = session.query(Users).filter_by(Users.id == 1).all()
李代沫同性通常这两个⽅法都会⽤到的,所以⼀定要掌握它们的区别:
filter filter_by⽀持所有⽐较运算符,相等⽐较⽤⽐较⽤==只能使⽤"=","!="和"><"过滤⽤类名.属性名过滤⽤属性名不⽀持组合查询,只能连续调⽤filter变相实现参数是**kwargs,⽀持组合查询⽀持and,or和in等
更新数据有两种⽅法,⼀种是使⽤query中的update⽅法:
filter filter_by
⽀持所有⽐较运算符,相等⽐较⽤⽐较⽤==只能使⽤"=","!="和"><"
过滤⽤类名.属性名过滤⽤属性名
过滤⽤类名.属性名参数是**kwargs,⽀持组合查询
⽀持and,or和in等
更新数据有两种⽅法,⼀种是使⽤query中的update⽅法:
session.query(Users).filter_by(id=1).update({'name': "Jack"})
另⼀种是操作对应的表模型:
素媛真实故事原型
users = session.query(Users).filter_by(name="Jack").first()
users.name = "test"
session.add(users)
这两种⽅式呢,⼀般批量更新的话我会选前者,⽽要对查询获取对象属性之后再更新的场景就需要使⽤后者。
和更新数据类似,删除数据也有两种⽅法,第⼀种:
delete_users = session.query(Users).filter(Users.name == "test").first()
if delete_users:
session.delete(delete_users)
sessionmit()
第⼆种:
session.query(Users).filter(Users.name == "test").delete()
sessionmit()
批量删除时推荐使⽤第⼆种。
以上,就是Python sqlalchemy的基本⽤法。
代码可参照:my github
1.基本⽤法
1.安装
安装sqlalchemy
pip3 install sqlalchemy
pip3 install pymysql
本⽂使⽤MySQL作为数据库,使⽤pymysql作为驱动,因此需要安装pymysql
2.连接数据库
1.配置信息
在连接数据库前,需要使⽤到⼀些配置信息,然后把它们组合成满⾜以下条件的字符串:dialect+driver://username:password@host:port/database
dialect:数据库,如:sqlite、mysql、oracle等
driver:数据库驱动,⽤于连接数据库的,本⽂使⽤pymysql
username:⽤户名
password:密码
host:IP地址
port:端⼝
database:数据库
HOST = 'localhost'
PORT = 3306
USERNAME = 'root'
PASSWORD = '123456'
DB = 'myclass'
# dialect + driver://username:passwor@host:port/database
DB_URI = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DB}'
建议将配置信息放到你的配置⽂件中,如config.py
2.创建引擎并连接数据库
from sqlalchemy import create_engine
from config import DB_URI
engine = create_engine(DB_URI)  # 创建引擎
conn = t()  # 连接
result = ute('SELECT 1')  # 执⾏SQL
print(result.fetchone())
conn.close()  # 关闭连接
3.创建ORM模型并映射到数据库中
declarative import declarative_base
from sqlalchemy import create_engine, Column, Integer, String
import sessionmaker
from config import DB_URI
engine = create_engine(DB_URI)
Base = declarative_base(engine)  # SQLORM基类
session = sessionmaker(engine)()  # 构建session对象
荆州景点class Student(Base):
__tablename__ = 'student'  # 表名
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(50))
age = Column(Integer)
sex = Column(String(10))
执⾏上⾯代码,将会在数据库中⽣成对应的映射表student。
4.新增数据
创建表后,接下来我们要添加数据,代码如下:
student = Student(name='Tony', age=18, sex='male')  # 创建⼀个student对象
session.add(student)  # 添加到session
sessionmit()  # 提交到数据库
也可以批量添加数据:
session.add_all([
Student(name='Jane', age=16, sex='female'),
Student(name='Ben', age=20, sex='male')
])
sessionmit()
4.查询数据
sqlalchemy提供了query()⽅法来查询数据
获取所有数据
item_list = session.query(Student).all()
print(item_list)
for item in item_list:
print(item.name, item.age)
执⾏结果如下
[<mymodel.Student object at 0x000002A0E6A38088>, <mymodel.Student object at 0x000002A0E6A38208>, <mymodel.Student object at 0x000002A0E6A38288>] Tony 18
Jane 16
Ben 20
查询得到的item_list是⼀个包含多个Student对象的列表
指定查询列
item_list = session.query(Student).all()
print(item_list)
for item in item_list:
print(item.name, item.age)
执⾏结果如下
[<mymodel.Student object at 0x000002A0E6A38088>, <mymodel.Student object at 0x000002A0E6A38208>, <mymodel.Student object at 0x000002A0E6A38288>] Tony 18
Jane 16
Ben 20
查询得到的item_list是⼀个包含多个Student对象的列表
指定查询列
item_list = session.query(Student.name).all()
print(item_list)
# [('Tony',), ('Jane',), ('Ben',)]
获取返回数据的第⼀⾏
item = session.query(Student.name).first()
print(item)
# ('Tony',)
使⽤filter()⽅法进⾏筛选过滤
item_list = session.query(Student.name).filter(Student.age >= 18).all()
print(item_list)
# [('Tony',), ('Ben',)]
使⽤order_by()进⾏排序
item_list = session.query(Student.name, Student.age).order_by(Student.age.desc()).all() # desc()表⽰倒序
print(item_list)
# [('Ben', 20), ('Tony', 18), ('Jane', 16)]
多个查询条件(and和or)
# 默认为and, 在filter()中⽤,分隔多个条件表⽰and
item_list = session.query(Student.name, Student.age, Student.sex).filter(
Student.age >= 10, Student.sex == 'female'
).all()
print(item_list)  # [('Jane', 16, 'female')]