关于sqlalchemy的使用
关于sqlalchemy的使用
- 说明
- 一、sqlachemy总体使用思路
- 二、安装与创建库、连结库
- 三、创建表、增加数据
- 四、查询记录
- 五、更新或删除
- 六、关联表定义
- 七、一对多关联查询
- 八、映射类定义与添加记录
说明
- 本教程所需软件及库python3.10、sqlalchemy
- 安装与创建库、连结库
- 创建表、增加数据
- 查询记录
- 更新或删除
- 关联表定义
一、sqlachemy总体使用思路
- 在创建或连结后会返回engine(可以参考第二节安装与创建库、连结库)
- 在创建表后会返回一个表名(可以参考第三节创建表、增加数据)
- 使用时表名.方法.属性
- 方法有insert,select,update,delecte
- 与数据对接时,conn = engine.connect()—conn.execut(表方法返回的值)
- 当数据库的数据发生改变时,要提交(conn.commit())
- 查询时,要注意条件,有两种方法where() | or_ | and_
二、安装与创建库、连结库
- 安装库
pip install sqlalchemy
#查看版本
sqlalchemy.__vetrsion__
- 创建库或连结库
#连结或创建sqlite3
from sqlalchemy import create_engine
engine = create_engine('sqlite:///db_path.db',echo=True)
conn = engine.connect()
#连结或创建mysql
from sqlalchemy import create_engine
engine = create_engine('mysql://user:pwd@localhoast/库名',echo=True)
conn = engine.connect()
注:create_engine如果已经存在就连结,如果不存在就创建。
- 在sqlalchemy执行sql语句
import sqlachemy
query = sqlachemy.text("select * from 表名")#sql语句
engine = sqlalchemy.create_engine(`sqlite:///db_path.db`,echo=True)
conn = engine.connect()
result_set = conn.execute(query)
print(result_set.all())
conn.close()
engine.dispose()
注:以下代码engine代表创建或检查数据库,conn代表连结数据库。
三、创建表、增加数据
- 创建表
创建表要用到sqlalchemy的三个库MetaData、Table、Column及类型代码
from sqlalchemy import MetaData,Table,Column
meta = MetaData()
#Meta定义好的字段属性存在这,所以第二个字段就要传它
var = Table(
'表名',meta,
Clolumn('字段名',sqlachemy.类型,primary_key=True),
.......
)
meta.create_all(engine)#创建表
如果表已经存在了,就不会创建,如果不存在就创建。
2. sqlachemy字段类型
名称 | 字段英文 | 用法 | 说明 |
---|---|---|---|
整形 | Integer | Integer | 存整数 |
小数 | 存小数 | ||
字符 | String | String(字符个数) | 存字符 |
日期 | Date | Date | 存年月日 |
– | – | – | – |
注:主键primary_key=True,unique=True唯一,unllable=True不能为空。
- 增加数据(insert)
3.1 插入一条数据
var = 表名.insert().values(字段名=值,......)
with engine.connect() as conn:
conn.execute(var)
conn.commit()
1、连结conn以后执行数据库操作要用conn.execut(sqlachemy语句)
2、数据库数据有变要提交事务,conn.commit()
3、var = 表名.insert().values(字段名=值,…)是新增数据的sqlachemy语句
4、 自增长是插一次,它就增加一次,它不管你是否成功
3.2 插入多条数据
var = 表名.insert()
with engine.connect() as conn:
conn.execute(var,[
{'字段名':value,.......},
{'字段名':value,.......},
........
])
conn.commit()
这个要用列表,并且列表里放字典,key是字段名,value是对应的值
四、查询记录
- sql查询语句
select * from 表名
- 函数表达式
表名.select()
- 结果获取
结果.fetchall()#获取所有数据
结果.fetchone()#获取第一条数据
- 条件查询
表名.select().where(表名.c.字段名条件)
#一次只能有一个条件
#如果多个条件查询时,在后面加.where(表名.c.字段名条件)
- and_(与)、or_(或)
from sqlalchemy.sql import and_,or_
表名.select().where(or_(条件,条件.....) | and_(条件,条件.....))
# 要在where中使用and_,or_
# and_,or_可以相互嵌套
五、更新或删除
- 更新
表名.update().where(条件).values(字段名=value)
#查询结果后再更新值,一个values可以更新多条记录或所有记录,取决于查询的结果
- 删除
表名.delete().where(条件)
#查询结果后再删除,可以删除多条记录或所有记录,取决于查询的结果
六、关联表定义
- 一对多关联(sqlachemy.ForeignKey(‘表名.id’))
import sqlalchemy
#创建表
mate = sqlalchemy.MateData()
表名 = sqlachemy.Table('表名',mate,
sqlachemy.Column('字段名',sqlachemy.Integer,sqlachemy.ForeignKey('关联的表名.id'),nullable=False),
)
- 多对多
七、一对多关联查询
- 查询条件
imort sqlalchemy
join = 关联表名.join(被关联表名,关联表名.c.id==被关联表名.c.id)
- 使用查询
imort sqlalchemy
join = 关联表名.join(被关联表名,关联表名.c.id==被关联表名.c.id)
#关联表和被关联表的信息都显示
query = sqlalchemy.select(join).where(关联表或被关联表.字段=value)
#只显示关联表或被关联表的信息
query = sqlalchemy.select(被关联表名或关联表名).select_from(join).where(关联表或被关联表.字段=value)
print(conn.execute(query).fetchall())
八、映射类定义与添加记录
- 映射基础
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class 类名(Base):
__tablename__='表名'
字段名 = Column(类型,其它参数)
......
#创建表
类名.metadata.create_all(engine)
- 利用类添加记录
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
#上面的类名
#增加一条记录
var = 类名(字段名=value,......)#类名实例化
session.add(var)
session.commit()
#增加多条记录
varList = [类名实例化列表]
session.add_all(varList)
session.commit()