概念和数据类型
概念 | 对应数据库 | 说明 |
---|---|---|
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 | 存储时分秒 |
创建连接
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还有其它可选的参数,比如:
echo: 当设置为True时会将orm语句转化为sql语句打印,一般debug的时候可用
pool_size: 连接池的大小,默认为5个,设置为0时表示连接无限制
pool_recycle: 设置时间以限制数据库多久没连接自动断开
创建数据库表类(模型)
from sqlalchemy import create_engine, Column, String, Integer from sqlalchemy.ext.declarative import declarative_base # 创建对象的基类: from sqlalchemy.orm import sessionmaker Base = declarative_base() # 定义User对象: class User(Base): # 表的名字: __tablename__ = 'user' # 表的结构: id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(20), unique=True) def __init__(self, name): self.name = name # 链接数据库 engine = create_engine("mysql+pymysql://root:root@localhost/fisher") # 创建表 Base.metadata.create_all(engine)
declarative_base()是sqlalchemy内部封装的一个方法,通过其构造一个基类,这个基类和它的子类,可以将Python类和数据库表关联映射起来。
数据库表模型类通过__tablename__和表关联起来,Column表示数据表的列。
生成数据库表
Base.metadata.create_all(engine)
创建表,如果存在则忽略,执行以上代码,就会发现在db中创建了users表。
删除表:
注意注意删除一定要慎重,利用Base的drop_all删除表
Base.metadata.drop_all(engine)
主键
id = Column(Integer, primary_key=True,autoincrement=True) #primary_key设置主键,autoincrement=True设置自增
普通字段
# 32代表最大长度,添加index索引,不可以为null name = Column(String(32), index=True, nullable=False)
外键
#ForeignKeyForeignKey('teacher.tid'), teacher_id = Column(Integer,ForeignKey('teacher.tid'))
索引
# 32代表最大长度,添加index索引,不可以为null name = Column(String(32), index=True, nullable=False)
一对多
ForeignKey中的参数是表名.要关联的字段,注意这里的表名不是别的类名,而是__tablename__参数值
默认是同步删除同步更新的,也就是on delete cascade on update cascade
hobby_id = Column(Integer, ForeignKey("hobby.id"))
多对多
要自己创建关系表,分别和其它2张表做forejgnkey
class Server2Group(Base): __tablename__ = 'server2group' id = Column(Integer, primary_key=True, autoincrement=True) server_id = Column(Integer, ForeignKey('server.id')) group_id = Column(Integer, ForeignKey('group.id'))
session
sqlalchemy中使用session用于创建程序和数据库之间的会话,所有对象的载入和保存都需要通过session对象 。
通过sessionmaker调用创建一个工厂,并关联Engine以确保每个session都可以使用该Engine连接资源:
from sqlalchemy.orm import sessionmaker # 创建session DbSession = sessionmaker(bind=engine) session = DbSession()
session的常见操作方法包括:
flush:预提交,提交到数据库文件,还未写入数据库文件中
commit:提交了一个事务
rollback:回滚
close:关闭
增加数据
举个最简单的例子:
add_user = Users("test") session.add(add_user) session.commit()
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(User).filter_by(id=1).all() for item in users: print(item.name)
通常我们通过以上查询模式获取数据,需要注意的是,通过session.query()我们查询返回了一个Query对象,此时还没有去具体的数据库中查询,只有当执行具体的.all(),.first()等函数时才会真的去操作数据库。
其中,query有filter和filter_by两个过滤方法,上述例子也可写为:
users = session.query(User).filter_by(Users.id == 1).all()
通常这两个方法都会用到的,所以一定要掌握它们的区别:
filter | filter_by |
---|---|
支持所有比较运算符,相等比较用比较用== | 只能使用"=","!="和"><" |
过滤用类名.属性名 | 过滤用属性名 |
不支持组合查询,只能连续调用filter变相实现 | 参数是**kwargs,支持组合查询 |
支持and,or和in等 |
修改数据
更新数据有两种方法,一种是使用query中的update方法:
session.query(User).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) session.commit()
第二种:
session.query(Users).filter(Users.name == "test").delete() session.commit()
批量删除时推荐使用第二种。
以上,就是Python sqlalchemy的基本用法。
发表评论
侧栏公告
寄语
譬如朝露博客是一个分享前端知识的网站,联系方式11523518。
热评文章
标签列表
热门文章
友情链接