SQLAlchemy

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

Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
MySQL - Python
     mysql + mysqldb: / / <user>:<password>@<host>[:<port>] / <dbname>
 
pymysql
     mysql + pymysql: / / <username>:<password>@<host> / <dbname>[?<options>]
 
MySQL - Connector
     mysql + mysqlconnector: / / <user>:<password>@<host>[:<port>] / <dbname>
 
cx_Oracle
     oracle + cx_oracle: / / user: pass @host:port / dbname[?key = value&key = value...]
 
更多详见:http: / / docs.sqlalchemy.org / en / latest / dialects / index.html

步骤一:

使用 Engine/ConnectionPooling/Dialect 进行数据库操作,Engine使用ConnectionPooling连接数据库,然后再通过Dialect执行SQL语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
from  sqlalchemy  import  create_engine
 
 
engine  =  create_engine( "mysql+mysqldb://root:123@127.0.0.1:3306/s11" , max_overflow = 5 )
 
engine.execute(
     "INSERT INTO ts_test (a, b) VALUES ('2', 'v1')"
)
 
engine.execute(
      "INSERT INTO ts_test (a, b) VALUES (%s, %s)" ,
     (( 555 "v1" ),( 666 "v1" ),)
)
engine.execute(
     "INSERT INTO ts_test (a, b) VALUES (%(id)s, %(name)s)" ,
     id = 999 , name = "v1"
)
 
result  =  engine.execute( 'select * from ts_test' )
result.fetchall()
复制代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from sqlalchemy import create_engine


engine = create_engine("mysql+mysqldb://root:123@127.0.0.1:3306/s11", max_overflow=5)


# 事务操作
with engine.begin() as conn:
    conn.execute("insert into table (x, y, z) values (1, 2, 3)")
    conn.execute("my_special_procedure(5)")
    
    
conn = engine.connect()
# 事务操作 
with conn.begin():
       conn.execute("some statement", {'x':5, 'y':10})
复制代码

注:查看数据库连接:show status like 'Threads%';

步骤二:

使用 Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 进行数据库操作。Engine使用Schema Type创建一个特定的结构对象,之后通过SQL Expression Language将该对象转换成SQL语句,然后通过 ConnectionPooling 连接数据库,再然后通过 Dialect 执行SQL,并获取结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
from  sqlalchemy  import  create_engine, Table, Column, Integer, String, MetaData, ForeignKey
 
metadata  =  MetaData()
 
user  =  Table( 'user' , metadata,
     Column( 'id' , Integer, primary_key = True ),
     Column( 'name' , String( 20 )),
)
 
color  =  Table( 'color' , metadata,
     Column( 'id' , Integer, primary_key = True ),
     Column( 'name' , String( 20 )),
)
engine  =  create_engine( "mysql+mysqldb://root:123@127.0.0.1:3306/s11" , max_overflow = 5 )
 
metadata.create_all(engine)
# metadata.clear()
# metadata.remove()
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey

metadata = MetaData()

user = Table('user', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String(20)),
)

color = Table('color', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String(20)),
)
engine = create_engine("mysql+mysqldb://root:123@127.0.0.1:3306/s11", max_overflow=5)

conn = engine.connect()

# 创建SQL语句,INSERT INTO "user" (id, name) VALUES (:id, :name)
conn.execute(user.insert(),{'id':7,'name':'seven'})
conn.close()

# sql = user.insert().values(id=123, name='wu')
# conn.execute(sql)
# conn.close()

# sql = user.delete().where(user.c.id > 1)

# sql = user.update().values(fullname=user.c.name)
# sql = user.update().where(user.c.name == 'jack').values(name='ed')

# sql = select([user, ])
# sql = select([user.c.id, ])
# sql = select([user.c.name, color.c.name]).where(user.c.id==color.c.id)
# sql = select([user.c.name]).order_by(user.c.name)
# sql = select([user]).group_by(user.c.name)

# result = conn.execute(sql)
# print result.fetchall()
# conn.close()
View Code

 

更多内容详见:

    http://www.jianshu.com/p/e6bba189fcbd

    http://docs.sqlalchemy.org/en/latest/core/expression_api.html

注:SQLAlchemy无法修改表结构,如果需要可以使用SQLAlchemy开发者开源的另外一个软件Alembic来完成。

步骤三:

使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有组件对数据进行操作。根据类创建对象,对象转换成SQL,执行SQL。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
from  sqlalchemy.ext.declarative  import  declarative_base
from  sqlalchemy  import  Column, Integer, String
from  sqlalchemy.orm  import  sessionmaker
from  sqlalchemy  import  create_engine
 
engine  =  create_engine( "mysql+mysqldb://root:123@127.0.0.1:3306/s11" , max_overflow = 5 )
 
Base  =  declarative_base()
 
 
class  User(Base):
     __tablename__  =  'users'
     id  =  Column(Integer, primary_key = True )
     name  =  Column(String( 50 ))
 
# 寻找Base的所有子类,按照子类的结构在数据库中生成对应的数据表信息
# Base.metadata.create_all(engine)
 
Session  =  sessionmaker(bind = engine)
session  =  Session()
 
 
# ########## 增 ##########
# u = User(id=2, name='sb')
# session.add(u)
# session.add_all([
#     User(id=3, name='sb'),
#     User(id=4, name='sb')
# ])
# session.commit()
 
# ########## 删除 ##########
# session.query(User).filter(User.id > 2).delete()
# session.commit()
 
# ########## 修改 ##########
# session.query(User).filter(User.id > 2).update({'cluster_id' : 0})
# session.commit()
# ########## 查 ##########
# ret = session.query(User).filter_by(name='sb').first()
 
# ret = session.query(User).filter_by(name='sb').all()
# print ret
 
# ret = session.query(User).filter(User.name.in_(['sb','bb'])).all()
# print ret
 
# ret = session.query(User.name.label('name_label')).all()
# print ret,type(ret)
 
# ret = session.query(User).order_by(User.id).all()
# print ret
 
# ret = session.query(User).order_by(User.id)[1:3]
# print ret
# session.commit()

转载于:https://www.cnblogs.com/zhaozhenguo666/p/5700848.html

### SQLAlchemy 是什么? SQLAlchemy 是一个功能强大的 Python SQL 工具包和对象关系映射(Object-Relational Mapping, ORM)框架,它提供了全功能的数据库抽象层和透明的数据库转换,使得开发者能够以面向对象的方式操作数据库,同时支持多种数据库系统,极大地简化了数据库编程的复杂性[^3]。 ### SQLAlchemy 的核心特性 1. **ORM 支持**:SQLAlchemy 提供了灵活的 ORM 系统,允许开发者将数据库表映射到 Python 类,从而以面向对象的方式操作数据库数据。 2. **SQL 表达式语言**:除了 ORM,SQLAlchmey 还提供了强大的 SQL 表达式语言,支持构建复杂的 SQL 查询。 3. **多数据库支持**:SQLAlchemy 支持包括 MySQL、PostgreSQL、SQLite、Oracle 等在内的多种数据库系统。 4. **事务管理**:SQLAlchemy 提供了完整的事务管理功能,确保数据的一致性和完整性。 5. **连接池**:内置的连接池机制可以提高数据库连接的效率和性能。 ### 安装 SQLAlchemy 要安装 SQLAlchemy,可以使用 pip: ```bash pip install sqlalchemy ``` 如果需要连接特定的数据库(如 MySQL),还需要安装相应的驱动程序,例如 `pymysql`: ```bash pip install pymysql ``` ### 连接数据库 以下是一个使用 SQLAlchemy 连接 MySQL 数据库的示例: ```python from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker # 数据库连接字符串 DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/test' # 创建引擎 engine = create_engine(DATABASE_URI, echo=True) # 创建会话 Session = sessionmaker(bind=engine) session = Session() # 声明基类 Base = declarative_base() ``` ### 定义模型 在 SQLAlchemy 中,可以通过定义类来表示数据库表。以下是一个简单的模型定义示例: ```python from sqlalchemy import Column, Integer, String class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(50)) email = Column(String(50)) # 创建表 Base.metadata.create_all(engine) ``` ### 数据库操作 #### 插入数据 ```python new_user = User(name='Alice', email='alice@example.com') session.add(new_user) session.commit() ``` #### 查询数据 ```python # 查询所有用户 users = session.query(User).all() for user in users: print(user.name, user.email) # 条件查询 user = session.query(User).filter_by(name='Alice').first() print(user.email) ``` #### 更新数据 ```python user = session.query(User).filter_by(name='Alice').first() user.email = 'new_email@example.com' session.commit() ``` #### 删除数据 ```python user = session.query(User).filter_by(name='Alice').first() session.delete(user) session.commit() ``` ### 高级查询 SQLAlchemy 提供了丰富的查询 API,支持复杂的查询操作。例如,可以使用 `filter`、`order_by`、`group_by` 等方法来构建复杂的查询: ```python # 查询并排序 users = session.query(User).order_by(User.name).all() # 聚合查询 from sqlalchemy import func user_count = session.query(func.count(User.id)).scalar() print(f"Total users: {user_count}") ``` ### 在 Flask 中使用 SQLAlchemy 在 Flask 应用中,可以通过 `Flask-SQLAlchemy` 扩展来简化 SQLAlchemy 的使用: ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@127.0.0.1:3306/test' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) email = db.Column(db.String(50)) @app.route('/') def index(): users = User.query.all() return str(users) if __name__ == '__main__': app.run(debug=True) ``` ### 嵌入使用 SQL 语句 虽然 SQLAlchemy 提供了强大的 ORM 功能,但在某些情况下,直接使用原始 SQL 语句可能更方便。可以通过 `engine.execute()` 方法执行原始 SQL: ```python result = engine.execute("SELECT * FROM users") for row in result: print(row) ``` ### 总结 SQLAlchemy 是一个功能强大且灵活的 Python ORM 工具,适用于各种规模的应用程序开发。通过其丰富的功能,开发者可以更轻松地与数据库进行交互,同时保持代码的可维护性和可扩展性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值