你对于ORM框架中的SQLAlchemy真的了解吗?

Python ORM框架SQLAlchemy操作 ORM 全称Object Relational Mapping(对象关系映射)。 特点是操纵Python对象而不是SQL查询,也就是在代码层面考虑的是对象,而不是SQL,体现的是一种程序化思维,这样使得Python程序更加简洁易读。 具体的实现方式是将数据库表转换为Python类,其中数据列作为属性,数据库操作作为方法。 优点 简洁易读:将数据表抽象为对象(数据模型),更直观易读 可移植:封装了多种数据库引擎,面对多个数据库,操作基本一致,代码易维护 更安全:有效避免SQL注入 具体实现库 SQLOb 阅读详情

首先我们先来了解一下SQLAlchemy

SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

第一步: 安装SQLAlchemy

pip3 install sqlalchemy

第二步:SQLAlchemy的构架和流程 图下:

在这里插入图片描述

1、使用者通过ORM对象提交命令

2、将命令交给SQLAlchemy Core(Schema/Types SQL Expression Language)转换成SQL

3,使用Engine/ConnectionPooling/Dialect 进行数据库操作

3.1,匹配使用者事先配置好的egine

3.2,egine从连接池中取出一个链接

3.3,基于该链接通过Dialect调用DB API,将SQL转交给它去执行

通过上面的流程分析,我们分为两个阶段

第一个阶段(流程1-2):将SQLAlchemy的对象换成可执行的sql语句

第二个阶段(流程3):将sql语句交给数据库执行

如果我们不用SQLAlchemy的转换然后自己去写sql语句的话我们直接写完第一个阶段就可以开始执行了,如下所示:

from sqlalchemy import create_engine
#1 准备
# 需要事先安装好pymysql
# 需要事先创建好数据库:create database db1 charset utf8;
#2 创建引擎
egine=create_engine('mysql+pymysql://root@127.0.0.1/db1?charset=utf8')
#3 执行sql
# egine.execute('create table if not EXISTS t1(id int PRIMARY KEY auto_increment,name char(32));')
# cur=egine.execute('insert into t1 values(%s,%s);',[(1,"egon1"),(2,"egon2"),(3,"egon3")]) #按位置传值
# cur=egine.execute('insert into t1 values(%(id)s,%(name)s);',name='egon4',id=4) #按关键字传值
#4 新插入行的自增id
# print(cur.lastrowid)
#5 查询
cur=egine.execute('select * from t1')
cur.fetchone() #获取一行
cur.fetchmany(2) #获取多行
cur.fetchall() #获取所有行

第三步:DB API

SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如下所示:

#1、MySQL-Python
    mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
#2、pymysql
    mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
#3、MySQL-Connector
    mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
#4、cx_Oracle
    oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]

更多示例:http://docs.sqlalchemy.org/en/latest/dialects/index.html

创建表

在ORM中:

#类===>表
#对象==>表中的一行记录
#四张表:业务线,服务,用户,角色,利用ORM创建出它们,并建立好它们直接的关系
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,DateTime,Enum,ForeignKey,UniqueConstraint,ForeignKeyConstraint,Index
from sqlalchemy.orm import sessionmaker
egine=create_engine('mysql+pymysql://root@127.0.0.1:3306/db1?charset=utf8',max_overflow=5)
Base=declarative_base()

创建业务表:业务线

class Business(Base):
    __tablename__='business'
    id=Column(Integer,primary_key=True,autoincrement=True)
    bname=Column(String(32),nullable=False,index=True)

多对一:多个服务可以属于一个业务线,多个业务线不能包含同一个服务

class Service(Base):
    __tablename__='service'
    id=Column(Integer,primary_key=True,autoincrement=True)
    sname=Column(String(32),nullable=False,index=True)
    ip=Column(String(15),nullable=False)
    port=Column(Integer,nullable=False)

    business_id=Column(Integer,ForeignKey('business.id'))

    __table_args__=(
        UniqueConstraint(ip,port,name='uix_ip_port'),
        Index('ix_id_sname',id,sname)
    )

一对一:一种角色只能管理一条业务线,一条业务线只能被一种角色管理

class Role(Base):
    __tablename__='role'
    id=Column(Integer,primary_key=True,autoincrement=True)
    rname=Column(String(32),nullable=False,index=True)
    priv=Column(String(64),nullable=False)
    business_id=Column(Integer,ForeignKey('business.id'),unique=True)

多对多:多个用户可以是同一个role,多个role可以包含同一个用户

class Users(Base):
    __tablename__='users'
    id=Column(Integer,primary_key=True,autoincrement=True)
    uname=Column(String(32),nullable=False,index=True)

class Users2Role(Base):
    __tablename__='users2role'
    id=Column(Integer,primary_key=True,autoincrement=True)
    uid=Column(Integer,ForeignKey('users.id'))
    rid=Column(Integer,ForeignKey('role.id'))

    __table_args__=(
        UniqueConstraint(uid,rid,name='uix_uid_rid'),
    )

def init_db():
    Base.metadata.create_all(egine)
def drop_db():
    Base.metadata.drop_all(egine)
if __name__ == '__main__':
    init_db()  
    ###注:设置外键的另一种方式 ForeignKeyConstraint(['other_id'], ['othertable.other_id'])

增删改查

表结构

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy.orm import sessionmaker
egine=create_engine('mysql+pymysql://root@127.0.0.1:3306/db1?charset=utf8',max_overflow=5)
Base=declarative_base()
#多对一:假设多个员工可以属于一个部门,而多个部门不能有同一个员工(只有创建公司才把员工当骆驼用,一个员工身兼数职)
class Dep(Base):
    __tablename__='dep'
    id=Column(Integer,primary_key=True,autoincrement=True)
    dname=Column(String(64),nullable=False,index=True)
class Emp(Base):
    __tablename__='emp'
    id=Column(Integer,primary_key=True,autoincrement=True)
    ename=Column(String(32),nullable=False,index=True)
    dep_id=Column(Integer,ForeignKey('dep.id'))
    def init_db():
    Base.metadata.create_all(egine)
def drop_db():
    Base.metadata.drop_all(egine)
drop_db()
init_db()
Session=sessionmaker(bind=egine)
session=Session()

增加:

row_obj=Dep(dname='销售') #按关键字传参,无需指定id,因其是自增长的
session.add(row_obj)
session.add_all([
    Dep(dname='技术'),
    Dep(dname='运营'),
    Dep(dname='人事'),
])
session.commit()

删除:

session.query(Dep).filter(Dep.id > 3).delete()
session.commit()

修改:

session.query(Dep).filter(Dep.id > 0).update({'dname':'哇哈哈'})
session.query(Dep).filter(Dep.id>0).update({'dname':Dep.dname+'_SB'},synchronize_session=False)
session.query(Dep).filter(Dep.id>0).update({'id':Dep.id*100},synchronize_session='evaluate')
session.commit()

查询所有:

res=session.query(Dep).all() #for row in res:print(row.id,row.dname)

查所有,取指定字段

res=session.query(Dep.dname).order_by(Dep.id).all() #for row in res:print(row.dname)
res=session.query(Dep.dname).first()
print(res) # ('哇哈哈_SB',)

过滤查

res=session.query(Dep).filter(Dep.id > 1,Dep.id <1000) #逗号分隔,默认为and
print([(row.id,row.dname) for row in res])

其他的一些相关查询

准备表和数据

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy.orm import sessionmaker
egine=create_engine('mysql+pymysql://root@127.0.0.1:3306/db1?charset=utf8',max_overflow=5)
Base=declarative_base()
#多对一:假设多个员工可以属于一个部门,而多个部门不能有同一个员工(只有创建公司才把员工当骆驼用,一个员工身兼数职)
class Dep(Base):
    __tablename__='dep'
    id=Column(Integer,primary_key=True,autoincrement=True)
    dname=Column(String(64),nullable=False,index=True)
class Emp(Base):
    __tablename__='emp'
    id=Column(Integer,primary_key=True,autoincrement=True)
    ename=Column(String(32),nullable=False,index=True)
    dep_id=Column(Integer,ForeignKey('dep.id'))
def init_db():
    Base.metadata.create_all(egine)
def drop_db():
    Base.metadata.drop_all(egine)
drop_db()
init_db()
Session=sessionmaker(bind=egine)
session=Session()

准备数据

session.add_all([
    Dep(dname='技术'),
    Dep(dname='销售'),
    Dep(dname='运营'),
    Dep(dname='人事'),
])
session.add_all([
    Emp(ename='林海峰',dep_id=1),
    Emp(ename='李杰',dep_id=1),
    Emp(ename='武配齐',dep_id=1),
    Emp(ename='元昊',dep_id=2),
    Emp(ename='李钢弹',dep_id=3),
    Emp(ename='张二丫',dep_id=4),
    Emp(ename='李坦克',dep_id=2),
    Emp(ename='王大炮',dep_id=4),
    Emp(ename='牛榴弹',dep_id=3)
])
session.commit()

条件、通配符、limit、排序、分组、连表、组合
条件:

sql=session.query(Emp).filter_by(ename='林海峰') #filter_by只能传参数:什么等于什么
res=sql.all() #sql语句的执行结果
res=session.query(Emp).filter(Emp.id>0,Emp.ename == '林海峰').all() #filter内传的是表达式,逗号分隔,默认为and,
res=session.query(Emp).filter(Emp.id.between(1,3),Emp.ename == '林海峰').all()
res=session.query(Emp).filter(Emp.id.in_([1,3,99,101]),Emp.ename == '林海峰').all()
res=session.query(Emp).filter(~Emp.id.in_([1,3,99,101]),Emp.ename == '林海峰') #~代表取反,转换成sql就是关键字not
from sqlalchemy import and_,or_
res=session.query(Emp).filter(and_(Emp.id > 0,Emp.ename=='林海峰')).all()
res=session.query(Emp).filter(or_(Emp.id < 2,Emp.ename=='功夫熊猫')).all()
res=session.query(Emp).filter(
    or_(
        Emp.dep_id == 3,
        and_(Emp.id > 1,Emp.ename=='功夫熊猫'),
        Emp.ename != ''
    )
).all()

通配符:

res=session.query(Emp).filter(Emp.ename.like('%海_%')).all()
res=session.query(Emp).filter(~Emp.ename.like('%海_%')).all()

limit:

res=session.query(Emp)[0:5:2]

排序:

res=session.query(Emp).order_by(Emp.dep_id.desc()).all()
res=session.query(Emp).order_by(Emp.dep_id.desc(),Emp.id.asc()).all()

分组:

from sqlalchemy.sql import func
res=session.query(Emp.dep_id).group_by(Emp.dep_id).all()
res=session.query(
    func.max(Emp.dep_id),
    func.min(Emp.dep_id),
    func.sum(Emp.dep_id),
    func.avg(Emp.dep_id),
    func.count(Emp.dep_id),
).group_by(Emp.dep_id).all()
res=session.query(
    Emp.dep_id,
    func.count(1),
).group_by(Emp.dep_id).having(func.count(1) > 2).all()

连表:笛卡尔积

res=session.query(Emp,Dep).all() #select * from emp,dep;
#where条件
res=session.query(Emp,Dep).filter(Emp.dep_id==Dep.id).all()
# for row in res:
#     emp_tb=row[0]
#     dep_tb=row[1]
#     print(emp_tb.id,emp_tb.ename,dep_tb.id,dep_tb.dname)
#内连接
res=session.query(Emp).join(Dep)
#join默认为内连接,SQLAlchemy会自动帮我们通过foreign key字段去找关联关系
#但是上述查询的结果均为Emp表的字段,这样链表还有毛线意义,于是我们修改为
res=session.query(Emp.id,Emp.ename,Emp.dep_id,Dep.dname).join(Dep).all()
#左连接:isouter=True
res=session.query(Emp.id,Emp.ename,Emp.dep_id,Dep.dname).join(Dep,isouter=True).all()
#右连接:同左连接,只是把两个表的位置换一下

组合:

q1=session.query(Emp.id,Emp.ename).filter(Emp.id > 0,Emp.id < 5)
q2=session.query(Emp.id,Emp.ename).filter(
    or_(
        Emp.ename.like('%海%'),
        Emp.ename.like('%昊%'),
    )
)
res1=q1.union(q2) #组合+去重
res2=q1.union_all(q2) #组合,不去重
print([i.ename for i in q1.all()]) #['林海峰', '李杰', '武配齐', '元昊']
print([i.ename for i in q2.all()]) #['林海峰', '元昊']
print([i.ename for i in res1.all()]) #['林海峰', '李杰', '武配齐', '元昊']
print([i.ename for i in res2.all()]) #['林海峰', '李杰', '武配齐', '元昊', '元昊', '林海峰']

现在是子查询:有三种形式的子查询,子查询的sql必须用括号包起来

#示例:查出id大于2的员工,当做子查询的表使用
#原生SQL:
# select * from (select * from emp where id > 2);
#ORM:
res=session.query(
    session.query(Emp).filter(Emp.id > 8).subquery()
).all()
#示例:#查出销售部门的员工姓名
#原生SQL:
# select ename from emp where dep_id in (select id from dep where dname='销售');
#ORM:
res=session.query(Emp.ename).filter(Emp.dep_id.in_(
    session.query(Dep.id).filter_by(dname='销售'), #传的是参数
    # session.query(Dep.id).filter(Dep.dname=='销售') #传的是表达式
)).all()
#示例:查询所有的员工姓名与部门名
#原生SQL:
# select ename as 员工姓名,(select dname from dep where id = emp.dep_id) as 部门名 from emp;
#ORM:
sub_sql=session.query(Dep.dname).filter(Dep.id==Emp.dep_id) #SELECT dep.dname FROM dep, emp WHERE dep.id = emp.dep_id
sub_sql.as_scalar() #as_scalar的功能就是把上面的sub_sql加上了括号
res=session.query(Emp.ename,sub_sql.as_scalar()).all()

正查和反查
表修改:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy.orm import sessionmaker,relationship
egine=create_engine('mysql+pymysql://root@127.0.0.1:3306/db1?charset=utf8',max_overflow=5)
Base=declarative_base()
class Dep(Base):
    __tablename__='dep'
    id=Column(Integer,primary_key=True,autoincrement=True)
    dname=Column(String(64),nullable=False,index=True)
class Emp(Base):
    __tablename__='emp'
    id=Column(Integer,primary_key=True,autoincrement=True)
    ename=Column(String(32),nullable=False,index=True)
    dep_id=Column(Integer,ForeignKey('dep.id'))

    #在ForeignKey所在的类内添加relationship的字段,注意:
    #1:Dep是类名
    #2:depart字段不会再数据库表中生成字段
    #3:depart用于Emp表查询Dep表(正向查询),而xxoo用于Dep表查询Emp表(反向查询),
    depart=relationship('Dep',backref='xxoo')
def init_db():
    Base.metadata.create_all(egine)
def drop_db():
    Base.metadata.drop_all(egine)

drop_db()
init_db()
Session=sessionmaker(bind=egine)
session=Session()
# 准备数据
session.add_all([
    Dep(dname='技术'),
    Dep(dname='销售'),
    Dep(dname='运营'),
    Dep(dname='人事'),
])
session.add_all([
    Emp(ename='林海峰',dep_id=1),
    Emp(ename='李杰',dep_id=1),
    Emp(ename='武配齐',dep_id=1),
    Emp(ename='元昊',dep_id=2),
    Emp(ename='李钢弹',dep_id=3),
    Emp(ename='张二丫',dep_id=4),
    Emp(ename='李坦克',dep_id=2),
    Emp(ename='王大炮',dep_id=4),
    Emp(ename='牛榴弹',dep_id=3)
])
session.commit()

连表查询:

# 示例:查询员工名与其部门名
res=session.query(Emp.ename,Dep.dname).join(Dep) #迭代器
for row in res:
    print(row[0],row[1]) #等同于print(row.ename,row.dname)

基于relationship的正查、反查

#SQLAlchemy的relationship在内部帮我们做好表的链接
#查询员工名与其部门名(正向查)
res=session.query(Emp)
for row in res:
    print(row.ename,row.id,row.depart.dname)
#查询部门名以及该部门下的员工(反向查)
res=session.query(Dep)
for row in res:
    # print(row.dname,row.xxoo)
    print(row.dname,[r.ename for r in row.xxoo])

以上就是小编今天带来的内容 小编本身就是一名python开发工程师,我自己花了三天时间整理了一套python学习教程,从最基础的python脚本到web开发,爬虫,数据分析,数据可视化,机器学习,等,这些资料有想要的小伙伴 点击 即可领取

谈谈Python中的ORM框架,如SQLAlchemy 综上所述,SQLAlchemy作为Python中的ORM框架,具有灵活性与可扩展性、关系管理与查询构建、事务管理与并发控制、集成性与可维护性以及性能优化与调试等多方面的优势。SQLAlchemy可以与各种Python Web框架(如Flask、Django等)和数据库(如MySQL、PostgreSQL、SQLite等)无缝集成,使得开发者能够在一个统一的框架内完成整个应用程序的开发。在查询构建方面,SQLAlchemy提供了强大的查询API,允许开发者以链式调用的方式构建复杂的查询语句。 阅读详情

相关推荐

Python ORM之SQLAlchemy全面指南

一、SQLAlchemy 是python中,通过ORM操作数据库的框架。简单点来说,就是帮助我们从烦冗的sql语句中解脱出来,从而不需要再去写原生的sql语句,只需要用python的语法来操作对象,就能被自动映射为sql语句。它有几个不同的组件,可以单独使用或组合在一起。类到表之间的映射规则SQL 语句Engine引擎连接池Dialect方言,调用不同的数据库 API(Oracle, postgresql, Mysql) 并执行对应的 SQL语句通过PIP安装使用setup.py安装。

shenqigongshi的博客 1850

用SQLAlchemy执行原生SQL

sqlarchemy操作原生sql语句的办法: from flask import Flask from sqlalchemy import create_engine import pymysql """ sqlalchemy的初步使用,用SQLAlchemy执行原生SQL: """ HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'db57' USERNAME = 'root' PASSWORD = 'root123456123456789.

wtt234的专栏 9437

U8 API接口开发踩过的坑

U8 API接口开发踩过的坑

haiyang5233233的专栏 1656

SQLAlchemy 执行原生 SQL语句

使用 sqlalchemy ,一般通过 Session 对象 ORM 方式操作数据库。如果需要通过 原生 SQL 语句操作数据库,就需要跟 Engine 和 Connect 对象打交道。 Engine 对象包含数据库连接池和数据库方言,通过 create_engine() 函数来创建,engine 对象的 connect() 方法返回 Connection 对象,Connection 对象提供 execute() 方法,允许通过原生 sql 语句来操作数据库。 本篇以 SQLite 数据库为例,简单介绍原生

王敏的专栏 2万+

2024年上市公司ESG评级全解析:六大权威数据源横向对比与应用指南

本文深度解析2024年国内主流ESG评级数据源,包括华证、商道融绿、Wind、富时罗素和彭博,横向对比其覆盖范围、评分逻辑与应用侧重点。文章提供实战指南,帮助投资者与企业根据投资决策、风险管理和学术研究等不同场景,精准选择并有效应用ESG数据,实现从概念到实用分析工具的转变。

weixin_29229055的博客 312

组态王|以一定的时间间隔查询某个时间段内的历史数据

使用该函数其他都可以满足,唯一问题是变量的选择,当切换站点后查询历史数据时,所选的变量依然是上次站点查询时所选择的变量,每当更换站点查询时都需要重新选择变量,这一点太繁琐,是用户和操作者无法忍受的。但是由于现场可能数据变化并非太过频繁,想要实现记录频率不变,还是以1分钟一次的频率进行存储,但是报表查询的时候想要只显示整点的数据。其中日历控件的设置与之前的历史数据查询是一样的,报表的抬头设置都是不用变的,此处不再赘述,有兴趣的可以。以上为组态王中以一定的时间间隔查询某个时间段内的历史数据的实现过程。

做有价值的事,积累有价值的笔记! 2544

Flask入门(10):Flask使用SQLAlchemy

Flask使用SQLAlchemy

qq_43745578的博客 3457

centos7安装Ambari 2.7.5 + HDP3.1.5

准备 1.安装包准备: Ambari2.7.5、HDP31.5、libtirpc-devel: centos7操作系统: 链接:https://pan.baidu.com/s/1vzvio5rAMsbYF0-0vBs5dw 提取码:xij9

kxq的博客 5091

SQLAlchemy会话中如何执行SQL查询

请注意,虽然session.execute()允许您执行任意SQL语句,但在使用ORM时,通常建议尽可能使用ORM提供的高级功能(如模型类、关系等),以便更好地利用SQLAlchemy的特性和优势。然而,在某些情况下,直接执行SQL语句可能是必要的或更方便的。在这个示例中,text()函数用于创建一个SQL文本对象,该对象表示要执行的SQL语句。然后,您可以将这个文本对象传递给session.execute()方法,并可选地传递一个参数字典来绑定SQL语句中的参数(这有助于防止SQL注入攻击)。

Flask Web 1126

Linux音频调试实战:ALSA架构与tinymix工具的高级应用技巧

本文深入探讨了Linux音频调试的核心技术,重点解析了ALSA架构下音频信号的路由与混合机制。通过介绍轻量级命令行工具tinymix的高级应用技巧,指导开发者如何精准排查无声、音量异常、多路音频共存等复杂问题,并分享编写自动化测试脚本以提升嵌入式及智能设备音频开发效率的实战方法。

weixin_29210727的博客 101

运算放大器测试方法-输入失调电压

由于运放输入回路的不对称性,在输入端将产生一定的误差信号,从而限制运放信号灵敏度。通常用输入失调电压(VOS)、输入失调电流(Ios)和输入偏置电流(IB)表示。运放有四个主要特征:输入失调特征、开环特征、共模特征及输出特征。其放大倍数较大,由于外界的影响,即使运放的输入端产生较小的输入信号,经过放大,在输出端也会产生较大的误差。为能精确测量其性能,一般采用辅助运放进行测试。下面着重讲了运放的主要参数及如何精确测量这些参数。文中DUT代表被测运放,A代表辅助运放。

weixin_46135931的博客 1万+

flask-sqlalchemy中的基本sql操作

也就是说,手动创建时间类型的数据时,flush之后,自己创建时是什么类型,获取到的还是什么类型;数据库默认创建的时间类型是datetime类型的。这种情况下,第一次会输出。

月光晒了很凉快的博客 1861

嵌入式系统开发笔记96:将STM32CubeIDE设置为中文

本文介绍将STM32CubeIDE设置为中文的方法。

snmplink的博客 8538

python常用库之数据库orm框架之SQLAlchemy

SQLAlchemy是一个基于Python实现的SQL工具包和ORM框架,提供了高层抽象来管理数据库交互。

西京刀客 2万+

8.DJI-PSDK:一站式项目功能开发总结(空中气象站项目/激光甲烷检测项目)

本文将以一篇文章的幅度快速完成: 项目一:空中气象站项目; 项目二:激光甲烷项目; 项目所使用的PSDK来源于第0章节末尾的百度网盘;解压:Payload-SDK-3.8.zip代码所在目录:双击打开: 修改打印串口和相关波特率,我们修改如下: 进行相关编译选项配置如下: :

哒宰的博客 294

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Python 数据持久层ORM框架 SQLAlchemy模块

SQLAlchemy:强大的数据库抽象层,简化ORM操作,提供高效查询接口,支持多种数据库引擎。解锁数据交互潜能,助力开发者专注业务逻辑。选择SQLAlchemy,让数据库管理变得轻松而高效!

weixin_54217348的博客 4280

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ORM框架(SQLAlchemy 与 Tortoise )

ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于在面向对象编程语言和关系数据库之间建立映射关系。它允许开发者使用面向对象的方式操作数据库,而不需要编写复杂的SQL语句。ORM的核心优势:代码可读性:使用Python对象而非SQL语句,代码更直观数据库无关性:同一套代码可以在不同数据库间切换安全性:自动防止SQL注入攻击维护性:模型变更时自动处理数据库结构变化。

zhangsan0933的博客 3342

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ORM框架及SQLAlchemy

ORM(如 SQLAlchemy)是现代软件开发中不可或缺的工具,它极大地简化了数据库操作,提升了开发效率和代码安全性。并非简单的 ORM,而是一个完整的 SQL 工具集。在提供高级对象抽象的同时,没有牺牲对底层 SQL 的控制力。架构优雅,功能强大且灵活,是构建中大型、高性能 Python 项目的首选。对于初学者,建议从 ORM 层开始学习,了解基本的模型定义和 CRUD 操作。随着项目的复杂,再逐步探索其 Core 层和更高级的特性。

m0_46322965的博客 1553

以SQLAlchemy 为例带大家了解什么是ORM

ORM,即对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的问题的技术。简单的来说,ORM框架其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。 ORM的四大核心要素是数据映射、实体操作、查询语言、事务处理。数据映射将程序中的对象映射到数据库中的数据,实现了两者的关联。实体操作则包括增删改查,通过操作实体对象来操作数据库。查询语言可以通过面向对象的方式来查询数据库,而事务处理可以实现事务的提交和回滚。

liwenxiang629的博客 1409

深入解析Python ORM框架SQLAlchemy

SQLAlchemy架构与核心机制解析 SQLAlchemy作为Python生态中成熟的ORM框架,采用分层架构设计,包含ORM层、Core层和引擎层。其核心机制包括:Engine与连接池、Dialect方言系统、分层架构、关键特性等。

专注人工智能应用领域 1040

SQLAlchemy ORM框架

ORM简介 ORM 全称 Object Relational Mapping, 叫对象关系映射。简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系。这样,我们要操作数据库,数据库中的表或者表中的一条记录就可以直接通过操作类或者类实例来完成。 对于数据的操作增、删、查、改(主要是查)得到的只是一个字符串没办法显示在前端界面。但用面向对象语言与类建立映射(mapping)后将得到的字符存储在内存中,在声明周期类显示在界面上。 我们知道操作数据库都是用SQL语句执行的: 建数据库 crea

个人学习笔记库,一篇一篇记录成长的足迹 2381

ORM框架SQLAlchemy

sqlalchemy是Python的SQL工具和ORM框架,可以用Python代码直接操作关系型数据库(例如:MySQL、PostgreSQL、Oracle)官方文档。

AZURE060606的博客 1137

ORM框架之SQLAlchemy

SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM:Object Relational Mappers)工具。SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,SQL数据库的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。因此,SQLAl...

diaolouan9546的博客 1935

常见4种主流ORM介绍与基本使用(Peewee ORM、Django ORM、SQLAlchemy ORM、Tortoise ORM)

对象关系映射(Object Relational Mapping,简称ORM)是一种程序设计技术,用于在面向对象编程语言和关系数据库之间进行数据转换。ORM的核心思想是通过创建一个“虚拟对象数据库”,使开发者可以使用面向对象的方式操作数据库,而不需要直接编写复杂的SQL语句。

qq_63926557的博客 1994

python-orm框架之SQLALchemy

使用 SQLAlchemy 的 ORM 功能来定义你的数据模型。

wsy_666的博客 1097

ORM框架之SQLAlchemy以及封装后的flask_sqlalchemy

什么是ORM 即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。 什么是SQLAchemy :Python编程语言下的一款ORM框架,将对象转换为SQL,然后使用数据API执行SQL并获取执行结果。以下两图可大致说明其工作方式 DB-A...

yuy32423的博客 1511
上一篇: 利用Python一键爬取上海二手房信息
下一篇: python中的exifread库只要一张图片就能获取你的精确位置
python程序员小'鹏
博客等级 码龄6年 163粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值