sqlalchemy

Python:数据库操作模块SQLAlchemy

SQLAlchemy的ORM是一个映射函数(Mapper),将Python中定义的与数据库中的建立关联,以及类的实例(instance)和表的行(row)建立关联 
查看一个类所对应的数据库表,使用__tablename__属性,例如 User.__tablename__

1. 查询数据 (query)

1.1 查询一个trace中flow个数(to countflows of specific trace)
session.query(Flow).filter(Flow.trace_id == 1).count()

1.2. 查询一个trace中不同srcIP的个数 (to count distinctsrcIP)
from sqlalchemy import distinct
from config import *
session = DBSession()
session.query(Flow.srcIP).filter(Flow.trace_id ==1).distinct().count()

1.3 查询一个trace中不同的dstIP和dstPort对的个数(to count distinct dstIPand dstPort)
session.query(Flow.dstIP,Flow.dstPort).filter(Flow.trace_id ==1).distinct().count()

1.4查询指定列的数据,返回一个KeyedTuple数据类型的列表( get a tuple list of specifiedcolumns )
n = session.query(Flow.dstIP,Flow.dstPort).filter(Flow.trace_id == 1).all()
# The type of n is list.
# The type of n[0] issqlalchemy.util._collections.KeyedTuple

1.5 查询指定列中的所有不同值( get a distincttuple list of specified columns)
n = session.query(Flow.dstIP,Flow.dstPort).filter(Flow.trace_id ==1).distinct().all()

1.6 获得一列数据的平均值(get average valueof a column)
# sql language: select avg(txPkt)from Flow
from sqlalchemy.sql importfunc
q = session.query(func.avg(Flow.txPkt)).filter(Flow.trace_id ==1)
print q[0][0]
# The type of q issqlalchemy.orm.query.Query
# The type of q[0] issqlalchemy.util._collections.KeyedTuple
# The type of q[0][0] isdecimal.Decimal

1.7 多列数据平均值的计算(compute averagevalues of columns)
q =session.query((func.avg(Flow.txPkt)+func.avg(Flow.rxPkt))/2).filter(Flow.trace_id == 1)

1.8 对查询到的数据排序(order by)
from sqlalchemy import desc
q =session.query(Flow.timestamp).filter(trace_id == 1).order_by(desc(Flow.timestamp))

1.9 分组查询
q = session.query(Flow.dstIP,Flow.dstPort, func.count(Flow.id)).filter(Flow.trace_id ==tid).group_by(Flow.dstIP,Flow.dstPort).all()

2 查询中,常用的过滤操作
等于(equals), 例如 query.filter(name == 'Jack')
不等于(not equals), 例如query.filter(name != 'Jack')
在列表中(in), 例如query.filter(name.in_(['Micheal', 'Bob', 'Jack']))
不在列表中(not in), 例如query.filter(~name.in_(['Micheal','Bob', 'Jack']))
空值(null), 例如 query.filter(name== None)
不是空值(not null), 例如query.filter(name != None)
与(and), 例如query.filter(and_(name == 'Andy', fullname == 'Andy Liu'))
and_可以省略, 例如query.filter(name=='Andy', fullname==‘Andy Liu')
或(or), 例如query.filter(or_(name == 'Andy', name == 'Micheal'))


2. 表的数据操作(table dataoperation)
2.1 添加\删除一个column ( add a newcolumn to a table)
from db import engine
from sqlalchemy import DDL
add_column = DDL('alter table Flow addcolumn cluster_id integer after trace_id')
drop_column = DDL('altertable Flow drop columnmicrosecond')
engine.execute(add_column)
engine.execute(drop_column)

2.2 修改一个数据(update  a value)
session.query(Flow).filter(Flow.dstIP == dstIP, Flow.dstPort== dstPort, Flow.trace_id == 1).update({'cluster_id' :0})

2.3 插入一行数据(insert arow)
    session =DBSession()
    cluster =Clusters(trace_id = tid, cluster_id = cid, \
                    dstIP =dIP, dstPort = dPort, \
                    avgPkt =aPkt, avgByte = aByte, \
                    size =count)
    session.add(cluster)
    session.commit() #commit or flush
    session.close()

2.4 删除一行数据(delete a row )
    session =DBSession()
   session.query(Clusters).filter(Clusters.trace_id =2).delete()
    session.commit() #commit or flush
    session.close()

补充:
外键 ForeignKey只能引用外表的指定列中已经存在的值。
### 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、付费专栏及课程。

余额充值