flasksqlalchemy执行sql语句
时间: 2023-05-23 21:01:46 浏览: 395
可以使用db.session.execute方法来执行sql语句,例如:
result = db.session.execute("SELECT * FROM table_name")
for row in result:
print(row)
这样可以执行sql语句并对结果进行处理。
相关问题
SQLAlchemy执行sql语句
<think>我们被要求使用中文回答,并且需要按照指定的格式处理数学表达式。但当前问题不涉及数学公式,因此我们主要关注如何回答关于SQLAlchemy执行SQL语句的问题。根据用户的问题:“我想了解如何使用SQLAlchemy执行SQL语句请问如何使用SQLAlchemy执行自定义SQL语句”我们参考了提供的引用内容,特别是引用[1]中展示了使用SQLAlchemy执行原生SQL的示例。回答步骤:1.创建引擎(engine)连接到数据库。2.使用引擎创建连接(connection)。3.通过连接执行SQL语句。同时,引用[3]中也展示了使用create_engine和session来执行操作,但用户问题重点在于执行自定义SQL,所以我们将展示两种常见方式:使用连接(connection)和使用会话(session)。注意:用户问题不涉及数学公式,所以不需要使用$...$或$$...$$格式。我们将按照以下结构回答:-介绍使用engine.connect()执行SQL(如引用[1]所示)-介绍使用session.execute()执行SQL(如引用[3]中的session也可以执行SQL)同时,根据指令,我们需要在回答末尾生成相关问题。另外,根据引用[1]中的示例,我们可以在适当的地方添加引用标识。开始回答:</think>### 如何使用 SQLAlchemy 执行自定义 SQL 语句
在 SQLAlchemy 中执行原生 SQL 语句主要有两种方式,以下分步骤说明:
#### 方法 1:使用数据库连接(Connection)
这是最直接的方式,适用于不需要 ORM 映射的简单 SQL 操作:
```python
from sqlalchemy import create_engine
# 创建数据库引擎(替换为你的连接参数)
engine = create_engine('mysql+pymysql://user:password@host:port/database')
# 获取连接并执行 SQL
with engine.connect() as conn:
# 执行 DDL(创建/修改表)
conn.execute("CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50))")
# 执行 DML(插入数据)
conn.execute("INSERT INTO users VALUES (1, 'Alice'), (2, 'Bob')")
# 执行查询并获取结果
result = conn.execute("SELECT * FROM users WHERE id > :id", {'id': 0})
for row in result:
print(row) # 输出:(1, 'Alice'), (2, 'Bob')
```
**关键点**:
- 使用 `engine.connect()` 获取数据库连接
- 参数化查询使用 `:param` 占位符和字典传参[^1]
- 查询结果返回 `ResultProxy` 可迭代对象
#### 方法 2:使用会话(Session)
适用于已配置 ORM 模型的场景,保持事务一致性:
```python
from sqlalchemy.orm import sessionmaker
from your_model_module import engine # 导入已创建的引擎
# 创建会话工厂
Session = sessionmaker(bind=engine)
# 在会话中执行 SQL
with Session() as session:
# 执行查询
result = session.execute("SELECT name FROM users WHERE id = :id", {'id': 1})
print(result.scalar()) # 输出:Alice
# 执行数据修改(需提交)
session.execute("UPDATE users SET name = 'Carol' WHERE id = 2")
session.commit() # 提交事务
```
**关键点**:
- 通过 `session.execute()` 执行 SQL
- 需显式调用 `session.commit()` 提交数据修改[^3]
- 使用 `result.scalar()` 获取单值结果
#### 注意事项
1. **参数绑定**:始终使用参数化查询防止 SQL 注入,如:
```python
# ✅ 安全方式
conn.execute("SELECT * FROM users WHERE name = :name", {'name': user_input})
# ❌ 危险方式(拼接字符串)
conn.execute(f"SELECT * FROM users WHERE name = '{user_input}'")
```
2. **结果处理**:
- `result.fetchall()` 返回所有行
- `result.mappings()` 返回字典形式结果
3. **事务管理**:连接默认开启事务,需显式提交(除查询外)[^2]
> **应用场景对比**:
> - 简单脚本/数据迁移 → 使用 `Connection`
> - Web 应用(如 Flask)→ 使用 `Session` 保持事务一致性
> - 表结构操作(CREATE/ALTER)→ 必须使用 `Connection`[^1]
flask SQLAlchemy 教程
### Flask SQLAlchemy 使用教程
Flask-SQLAlchemy 是一个专为 Flask 设计的扩展,旨在简化在 Flask 应用中使用 SQLAlchemy 的过程。它提供了一系列工具和默认配置,使得开发者能够更加高效地管理数据库操作[^1]。
#### 1. 环境准备
要开始使用 Flask-SQLAlchemy,首先需要安装所需的依赖包:
```bash
pip install flask flask-sqlalchemy
```
如果计划连接 MySQL 数据库,则还需要安装 `pymysql` 或者 `mysqlclient`:
```bash
pip install pymysql
```
---
#### 2. 基本配置
下面是一个典型的 Flask 应用程序配置示例,展示如何集成 SQLAlchemy 并初始化数据库:
```python
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 配置数据库 URI
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db' # SQLite 示例
# app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@host/db_name' # MySQL 示例
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭修改跟踪以节省内存
db = SQLAlchemy(app)
class Student(db.Model): # 定义模型类
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
city = db.Column(db.String(50))
addr = db.Column(db.String(200))
pin = db.Column(db.String(10))
with app.app_context(): # 创建表结构
db.create_all()
@app.route('/')
def show_students():
students = Student.query.all() # 查询所有学生数据
result = []
for student in students:
result.append({
'id': student.id,
'name': student.name,
'city': student.city,
'address': student.addr,
'pin': student.pin
})
return {'students': result}
```
---
#### 3. 模型定义与 CRUD 操作
##### (1) 插入新记录
向数据库插入一条新的学生记录:
```python
@app.route('/add_student', methods=['POST'])
def add_student():
data = request.json
new_student = Student(
name=data['name'],
city=data['city'],
addr=data['addr'],
pin=data['pin']
)
db.session.add(new_student)
db.session.commit()
return {"message": "Student added successfully"}, 201
```
##### (2) 更新现有记录
更新指定学生的部分信息:
```python
@app.route('/update_student/<int:id>', methods=['PUT'])
def update_student(id):
student = Student.query.get_or_404(id)
data = request.json
student.name = data.get('name', student.name)
student.city = data.get('city', student.city)
student.addr = data.get('addr', student.addr)
student.pin = data.get('pin', student.pin)
db.session.commit()
return {"message": "Student updated successfully"}
```
##### (3) 删除记录
删除指定的学生记录:
```python
@app.route('/delete_student/<int:id>', methods=['DELETE'])
def delete_student(id):
student = Student.query.get_or_404(id)
db.session.delete(student)
db.session.commit()
return {"message": "Student deleted successfully"}
```
---
#### 4. HTML 页面渲染
为了更好地展示数据,可以结合 Jinja2 渲染模板页面。以下是一个简单的 HTML 文件示例,用于显示学生列表[^3]:
```html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Flask 示例</title>
</head>
<body>
<h1>Flask SQLAlchemy 示例</h1>
<hr/>
{%- for message in get_flashed_messages() %}
{{ message }}
{%- endfor %}
<h1>(<a href="{{ url_for('new') }}">添加学生</a>)</h1>
<table border="1">
<thead>
<tr>
<th>姓名</th><th>城市</th><th>地址</th><th>PIN码</th>
</tr>
</thead>
<tbody>
{% for student in students %}
<tr>
<td>{{ student.name }}</td>
<td>{{ student.city }}</td>
<td>{{ student.addr }}</td>
<td>{{ student.pin }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
```
---
#### 5. 总结
通过以上步骤,您可以快速掌握 Flask-SQLAlchemy 的基础用法。该框架的主要优势在于其封装了复杂的 SQL 操作逻辑,使开发者只需专注于业务逻辑即可完成大部分常见的数据库交互任务[^2]。然而需要注意的是,ORM 方式的性能通常低于直接执行原始 SQL 语句的方式,因此对于高性能需求场景应谨慎评估是否适用[^4]。
---
###
阅读全文
相关推荐














