博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQLALchemy之介绍,基本使用
阅读量:6565 次
发布时间:2019-06-24

本文共 3298 字,大约阅读时间需要 10 分钟。

一、介绍

SQLALchemy也是一个python的ORM框架,django内部的ORM框架只适用于django,而SQLALchemy适用于所有python的web框架

 

SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

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

  • Engine,框架的引擎
  • Connection Pooling ,数据库连接池
  • Dialect,选择连接数据库的DB API种类
  • Schema/Types,架构和类型
  • SQL Exprression Language,SQL表达式语言
  • DBAPI,也就是pymysql或者MySQLdb模块

 

总体流程:类和对象的操作转换为SQL语句交给框架引擎,引擎去数据库连接池拿连接。从Dialect获取用哪个模块,然后调用DBAPI中对应的模块,利用模块去真正的数据库中做操作

 

 

二、使用

1、执行原生sql语句

import timeimport threadingimport sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy.engine.base import Engine engine = create_engine(    "mysql+pymysql://root:123@127.0.0.1:3306/t1?charset=utf8",    max_overflow=0,  # 超过连接池大小外最多创建的连接    pool_size=5,  # 连接池大小    pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错    pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置))  def task(arg):    conn = engine.raw_connection()    cursor = conn.cursor()    cursor.execute(        "select * from t1"    )    result = cursor.fetchall()    cursor.close()    conn.close()  for i in range(20):    t = threading.Thread(target=task, args=(i,))    t.start()

 

2、创建单表

因为SQLALchemy不能连接数据库,所以创建表的操作得我们自已用方法实现

import datetimefrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, IndexBase = declarative_base()class Users(Base):    # 设置表名    __tablename__ = 'users'    # 设置表的字段    # 主键    id = Column(Integer, primary_key=True)    # 设置字符串类型,最大长度是32,添加索引index    name = Column(String(32), index=True, nullable=False)    # email = Column(String(32), unique=True)    # ctime = Column(DateTime, default=datetime.datetime.now)    # extra = Column(Text, nullable=True)    __table_args__ = (        # 还可以设置联合唯一        # UniqueConstraint('id', 'name', name='uix_id_name'),        # 设置联合索引        # Index('ix_id_name', 'name', 'email'),    )def init_db():    """    根据类创建数据库表    :return:     """    engine = create_engine(        "mysql+pymysql://root:123@127.0.0.1:3306/s6?charset=utf8",        max_overflow=0,  # 超过连接池大小外最多创建的连接        pool_size=5,  # 连接池大小        pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错        pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)    )    # 这个方法就是帮我们做创建表的    Base.metadata.create_all(engine)def drop_db():    """    根据类删除数据库表    :return:     """    engine = create_engine(        "mysql+pymysql://root:123@127.0.0.1:3306/s6?charset=utf8",        max_overflow=0,  # 超过连接池大小外最多创建的连接        pool_size=5,  # 连接池大小        pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错        pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)    )    # 这个方法就是删除表    Base.metadata.drop_all(engine)if __name__ == '__main__':    # 要自己调用才能完成创建表和删除表的操作    drop_db()    init_db()

 

3、操作单表

(1)添加一条记录

from sqlalchemy.orm import sessionmakerfrom sqlalchemy import create_enginefrom models import Users  engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6", max_overflow=0, pool_size=5)Session = sessionmaker(bind=engine)  # 每次执行数据库操作时,都需要创建一个sessionsession = Session()  # ############# 执行ORM操作 ############## 添加一条记录,也就是实例化一个对象obj1 = Users(name="alex1")session.add(obj1)  # 提交事务session.commit()# 关闭sessionsession.close()

 

转载于:https://www.cnblogs.com/wanghl1011/articles/8670173.html

你可能感兴趣的文章
Android和MVC
查看>>
Linux 用户和用户组管理
查看>>
tomcat架构分析(valve源码导读)
查看>>
spring中InitializingBean接口使用理解(转)
查看>>
基于php5.5使用PHPMailer-5.2发送邮件
查看>>
InstallShield 2012 Spring新功能试用(16): Suite/Advanced UI 或 Advanced UI安装程序能在安装时进行输入合法性校验与反馈...
查看>>
C#面试宝典
查看>>
基金项目的英文
查看>>
《软件性能测试与LoadRunner实战教程》喜马拉雅有声图书上线
查看>>
ios 字典转模型
查看>>
Java类集
查看>>
类的生命周期
查看>>
php apache用户写文件夹权限设置
查看>>
003-诠释 Java 工程师【一】
查看>>
浅析rune数据类型
查看>>
普通用户开启AUTOTRACE 功能
查看>>
Bind+Nginx实现负载均衡
查看>>
游侠原创:推荐一款免费的Syslog转发工具
查看>>
UIKeyboard键盘相关知识点-IOS开发
查看>>
你真的会 snapshot 吗? - 每天5分钟玩转 OpenStack(163)
查看>>