zoukankan      html  css  js  c++  java
  • python3之SQLAlchemy

    1、SQLAlchemy介绍

    SQLAlchemy是Python SQL工具包和对象关系映射器,为应用程序开发人员提供了SQL的全部功能和灵活性。

    它提供了一整套众所周知的企业级持久性模式,专为高效和高性能的数据库访问而设计,适用于简单的Pythonic域语言。

    SQLAlchemy对象关系映射器提供了一种将用户定义的Python类与数据库表关联的方法,以及这些类(对象)在其相应表中具有行的实例。它包括一个系统,可以透明地同步对象及其相关行之间状态的所有变化(称为工作单元),以及根据用户定义的类和它们之间定义的关系来表示数据库查询的系统。

    2、sqlalchemy安装链接

    可以使用easy_install或者pip安装SQLAlchemy:

    easy_install sqlalchemy
    或者
    pip install sqlalchemy

    查看SQLAlchemy版本信息

    In [1]: import sqlalchemy
    
    In [2]: sqlalchemy.__version__
    Out[2]: '1.2.4'

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

    操作数据库方法1:

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

    连接数据库使用create_engine():

    from sqlalchemy import create_engine
    #链接数据库
    engine = create_engine('mysql+pymysql://test:123@10.0.0.10:3306/test')
    #创建表
    engine.execute('create table test1(id int,name varchar(48),salary int not null)')
    #插入表数据
    engine.execute("insert into test1(id,name,salary) values(1,'zs',88888)")
    #查看数据
    result = engine.execute('select * from test1')
    print(result.fetchall())

    不同数据库和API链接数据库的操作格式:

    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

    操作数据库方法2:

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

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2018/2/28 16:06
    # @Author  : Py.qi
    # @File    : sqlalchemy_mysql_metadata.py
    # @Software: PyCharm
    
    from sqlalchemy import select,create_engine, Table, Column, Integer, String, MetaData, ForeignKey
    
    metadata = MetaData()
    #创建表
    user = Table('teacher', metadata,
        Column('id', Integer, primary_key=True),
        Column('name', String(20)),
    )
    #创建表
    color = Table('student', metadata,
        Column('id', Integer, primary_key=True),
        Column('name', String(20)),
    )
    #链接数据库
    engine = create_engine("mysql+pymysql://test:123@10.0.0.10:3306/test", max_overflow=5)
    #执行引擎语句
    #metadata.create_all(engine)
    #获取sql游标
    conn = engine.connect()
    # 创建SQL语句,插入数据
    sql=user.insert().values(name='aa')
    sql1=user.insert().values(name='bb')
    #conn.execute(sql)
    #conn.close()
    
    #删除数据
    #sql3 = user.delete().where(user.c.id > 1)
    #conn.execute(sql3)
    #conn.close()
    #更新数据
    #sql4 = user.update().where(user.c.name == 'fenzi').values(name='dddd')
    #conn.execute(sql4)
    #查询数据
    sql5=select([user,])
    #sql6 = select([user.c.id,])
    #sql7 = select([user.c.id, color.c.name]).where(user.c.id=='6')
    # sql = select([user.c.name]).order_by(user.c.name)
    # sql = select([user]).group_by(user.c.name)
    
    result = conn.execute(sql5)
    print(result.fetchall())
    conn.close()

    操作数据库方法3:

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

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2018/2/28 17:16
    # @Author  : Py.qi
    # @File    : sqlalchemy_expression.py
    # @Software: PyCharm
    
    from sqlalchemy import Column,Integer,String
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    #echo输出详细
    engine = create_engine("mysql+pymysql://test:123@10.0.0.10:3306/test",max_overflow=5,echo=True)
    base=declarative_base() #创建基类
    class user(base):
        __tablename__ = 'users'
        id = Column(Integer,primary_key=True,autoincrement=True)
        hostname=Column(String(64),unique=True,nullable=False)
        ip_addr=Column(String(56),unique=True,nullable=False)
        port=Column(Integer,default=22)
    #寻找Base的所有子类,按照子类的结构在数据库中生成对应的数据表信息
    base.metadata.create_all(engine)
    Session=sessionmaker(bind=engine)
    session=Session()
    #增,插入单行
    #u = user(hostname='zs',ip_addr='333',port=22)
    #session.add(u)
    #插入多行
    #session.add_all([user(hostname='ls',ip_addr='111',port=873),
    #                 user(hostname='ww',ip_addr='888',port=23),
    #                 user(hostname='dff',ip_addr='567',port=3306)
    #                 ])
    #写入数据库
    #session.commit()
    
    #删除
    #session.query(user).filter(user.id > 3).delete()
    #session.commit()
    
    #修改
    # session.query(user).filter(user.id == 3).update({'hostname':'feng','port':3389})
    # session.commit()
    
    #
    #ret=session.query(user).filter_by(hostname='feng').first()
    # ret = session.query(user).filter_by(hostname='feng').all()
    # print(ret)
    
    ret = session.query(user).filter(user.hostname.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()

    SQLAlchemy官网:http://www.sqlalchemy.org/

  • 相关阅读:
    第十四回 基础才是重中之重~委托实例的几种定义方式(规规矩矩method,逻辑简单delegate,层次清晰lambda)
    第十五回 基础才是重中之重~老赵写的CodeTimer是代码性能测试的利器
    第十一回 基础才是重中之重~Conditional特性使代码根据条件在debug或者release模式中执行
    第十二回 基础才是重中之重~.net中的显式事务与隐式事务
    IE绝对定位元素神秘消失或被遮挡的解决方法
    图片按钮样式隐藏文字的
    javascript 保留小数
    Javascript兼容性问题小结(容易导致浏览器不同,又不容易察觉的)
    SQL 随机选取10条数据
    动态添加类和元素样式属性(style and className)
  • 原文地址:https://www.cnblogs.com/zhangxinqi/p/8480049.html
Copyright © 2011-2022 走看看