python sqlalchemy-orm-sqlite
使用老版sqlalchemy - orm sqllite执行demo程序 极简SQLAlchemy原生SQL Demo 规则所有SQL语句由调用者完整手写Navicat可直接运行无任何占位符? / :xxx 仅提供通用执行工具内部不拼接任何SQL from datetime import datetime from pathlib import Path from sqlalchemy import ( create_engine, Column, String, Text, Integer, Float, DateTime, JSON, text ) from sqlalchemy.orm import declarative_base, sessionmaker, Session # # 1. 引擎 会话不变 # DB_PATH Path(__file__).parent / orm_demo.db DATABASE_URL fsqlite:///{DB_PATH} engine create_engine( DATABASE_URL, connect_args{check_same_thread: False}, echoFalse, ) 可能是一个session工厂的function SessionLocal sessionmaker(autocommitFalse, autoflushFalse, bindengine) Base declarative_base() # # 2. 模型仅用于初始化建表业务不用ORM # class Article(Base): 仅初始化建表使用业务全部手写完整SQL __tablename__ articles id Column(Integer, primary_keyTrue, autoincrementTrue) title Column(String(200), nullableFalse) content Column(Text, default) author Column(String(100), default匿名) word_count Column(Integer, default0) rating Column(Float, default0.0) tags Column(JSON, nullableTrue) status Column(String(20), defaultdraft) created_at Column(DateTime, defaultdatetime.now) updated_at Column(DateTime, defaultdatetime.now, onupdatedatetime.now) # # 3. 极简通用工具函数核心无任何SQL拼接逻辑 # def get_session() - Session: return SessionLocal() def init_db(): 初始化数据库清空重建表 if DB_PATH.exists(): 直接删除 DB_PATH.unlink() Base.metadata.create_all(bindengine) print(f[INFO] 数据库初始化完成: {DB_PATH}) def fetch_one(full_sql: str): 执行完整查询SQL返回单条字典 :param full_sql: 调用者手写完整可直接在Navicat运行的SQL session get_session() try: sql text(full_sql) res session.execute(sql) row res.fetchone() return row._asdict() if row else None finally: session.close() def fetch_all(full_sql: str): 执行完整查询SQL返回全部结果列表 :param full_sql: 调用者手写完整可直接在Navicat运行的SQL session get_session() try: sql text(full_sql) res session.execute(sql) return [row._asdict() for row in res.fetchall()] finally: session.close() def execute_commit(full_sql: str) - int: 执行INSERT / UPDATE / DELETE完整SQL自动提交返回受影响行数 :param full_sql: 调用者手写完整可直接在Navicat运行的SQL session get_session() try: sql text(full_sql) res session.execute(sql) session.commit() return res.rowcount finally: session.close() # # 4. 事务通用工具多条完整SQL同一事务 # def transaction_execute(sql_list: list[str]): 事务执行多条完整SQL全部成功才提交任意异常全部回滚 :param sql_list: 完整SQL字符串列表每条都能单独在Navicat运行 session get_session() try: for sql in sql_list: session.execute(text(sql)) session.commit() print(✅ 事务全部执行成功已提交) return True except Exception as e: session.rollback() print(f 事务异常全部回滚: {e}) return False finally: session.close() # # 5. 调用示例所有SQL均为完整可直接Navicat运行 # def main(): print( * 60) print(极简原生SQL Demo - 全部SQL由调用者完整编写) print( * 60) init_db() # -------------------------- # 新增 - 完整INSERT SQL无占位符 # -------------------------- print(\n--- 新增文章完整SQL---) now datetime.now().isoformat() # 调用者自行拼接完整SQLNavicat直接执行 insert_sql f INSERT INTO articles (title, content, author, word_count, rating, tags, status, created_at, updated_at) VALUES (SQLAlchemy极简原生SQL, 全部SQL手写完整语句无任何占位符, 张三, 1200, 4.5, [Python,SQLAlchemy], published, {now}, {now}) execute_commit(insert_sql) insert_sql2 f INSERT INTO articles (title, content, author, word_count, rating, tags, status, created_at, updated_at) VALUES (FastAPI开发笔记, Web后端框架实战, 张三, 2500, 4.8, [Python,FastAPI], published, {now}, {now}) execute_commit(insert_sql2) # -------------------------- # 查询单条 # -------------------------- print(\n--- 根据ID查询单条 ---) select_one_sql SELECT * FROM articles WHERE id 1; article fetch_one(select_one_sql) print(f查询结果{article[title]}) # -------------------------- # 多条件分页查询完整SQL # -------------------------- print(\n--- 多条件分页查询 作者张三已发布 ---) select_page_sql SELECT * FROM articles WHERE author 张三 AND status published ORDER BY created_at DESC LIMIT 10 OFFSET 0; article_list fetch_all(select_page_sql) for item in article_list: print(f[{item[id]}] {item[title]}) # -------------------------- # 更新操作 完整UPDATE SQL # -------------------------- print(\n--- 更新文章评分 ---) update_sql UPDATE articles SET rating 5.0, updated_at 2026-07-26 14:30:00 WHERE id 1; execute_commit(update_sql) # -------------------------- # 删除操作 完整DELETE SQL # -------------------------- print(\n--- 创建临时文章并删除 ---) temp_insert_sql INSERT INTO articles (title, content, author, status) VALUES (临时待删文章, 测试删除, 测试, draft); execute_commit(temp_insert_sql) delete_sql DELETE FROM articles WHERE title 临时待删文章; execute_commit(delete_sql) # -------------------------- # 事务演示多条完整SQL一条异常全部回滚 # -------------------------- print(\n--- 事务回滚演示 ---) # 第二条SQL故意写错字段触发异常回滚 sql_batch [ INSERT INTO articles (title, author, status) VALUES (事务测试1, 测试, draft);, INSERT INTO articles (错误字段) VALUES (事务测试2);, ] transaction_execute(sql_batch) # -------------------------- # 最终全部数据查询 # -------------------------- print(\n--- 数据库全部文章 ---) all_sql SELECT id, title, author, rating, status FROM articles ORDER BY id; final_data fetch_all(all_sql) for row in final_data: print(f[{row[id]}] {row[title]} | 作者:{row[author]} | 评分:{row[rating]}) print(\n Demo 执行完毕) if __name__ __main__: main()

相关新闻

Java程序员该怎么样去看源码?

Java程序员该怎么样去看源码?

今天看到了一位博主分享自己阅读开源框架源码的心得,看了之后也引发了我的一些深度思考。我们为什么要看源码?我们该怎么样去看源码? 其中前者那位博主描述的我觉得很全了(如下图所示),就不做过多的赘述了&…

2026/11/2 16:18:18 阅读更多 →
ECEF转WGS84坐标转换:原理、C++实现与工程实践

ECEF转WGS84坐标转换:原理、C++实现与工程实践

1. 项目概述:从ECEF到WGS84的坐标转换在三维地理信息系统、卫星导航、无人机飞控或者任何需要处理地球空间数据的领域,我们经常会遇到两种核心的坐标表示方法:地心地固直角坐标系(ECEF)和世界大地坐标系(WG…

2026/10/27 19:04:11 阅读更多 →
如何快速提升浏览效率:LinkClump浏览器扩展终极指南

如何快速提升浏览效率:LinkClump浏览器扩展终极指南

如何快速提升浏览效率:LinkClump浏览器扩展终极指南 【免费下载链接】linkclump Google chrome extension that allows you to open multiple links at once. 项目地址: https://gitcode.com/gh_mirrors/li/linkclump 你是不是经常需要同时打开多个搜索结果&…

2026/11/2 13:28:54 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/2 0:25:10 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/2 10:46:11 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/2 10:47:40 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/2 1:16:51 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/2 10:46:31 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/2 10:46:26 阅读更多 →

日新闻

周新闻

月新闻