zoukankan      html  css  js  c++  java
  • SQLAchemy基础知识

      一、什么是SQLAchemy?

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

      1、安装SQLAlchemy

    pip3 install SQLAlchemy

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

    MySQL-Python
        mysql+mysqldb://用户名:密码(无密码为空)@<host>[:<port>]/<dbname>
       
    pymysql
        mysql+pymysql://用户名:密码(无密码为空)@<host>/<dbname>[?<options>]
       
    MySQL-Connector
        mysql+mysqlconnector://用户名:密码(无密码为空)@<host>[:<port>]/<dbname>
       
    cx_Oracle
        oracle+cx_oracle://用户名:密码(无密码为空)@host:port/dbname[?key=value&key=value...]
       
    更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html
    

      二、ORM的使用机制

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

    from sqlalchemy import create_engine
    
    # 基于pymysql连接数据库
    engine=create_engine("mysql+pymysql://root:@127.0.0.1:3306/db4?charset=utf8",max_overflow=5)
    
    #  创造出类
    Session=sessionmaker(bind=engine)
    
    #  实例化出对象
    session=Session()
    
    #  对象的方法
    
    #1、增:
    
    #    增加一行数据:
    obj=表名(列名1=值1,列名2=值2...)
    session.add(obj)
        
    #    增加多行数据:
    objs=[
        表名(列名1=值1,列名2=值2...),
        表名(列名1=值1,列名2=值2...),
        表名(列名1=值1,列名2=值2...),
        ...
    ]
    session.add_all(objs)
    
    #2、删:
    
    session.query(表名).delete()
    session.query(表名).filter(条件表达式).delete()
    
    #3、改:
    
    session.query(表名).filter(条件表达式).update({"列名1":"更新的值1",
    "列名2":"更新的值2",...})
    session.query(表名).filter(条件表达式).update({表名.列名1:值1+"str1",
    表名.列名2:值2+"str2",...},synchronize_session=False)
    #支持字符串拼接
    session.query(表名).filter(条件表达式).update({表名.列名1:num1+1,
    表名.列名2:num2+1,...},synchronize_session=evaluate)
    #支持值为数字的数学运算
    
    #4、 查:
    
    变量名=session.query(表名).filter(条件表达式).all()
    for row in 变量名:
        print(row.列名1,row.列名2...)
    orm相关语法

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

    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
     
    engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)
     
    Base = declarative_base()
     
    # 创建单表
    class Users(Base):
        __tablename__ = 'users'
        id = Column(Integer, primary_key=True)
        name = Column(String(32))
        extra = Column(String(16))
     
        __table_args__ = (
        UniqueConstraint('id', 'name', name='uix_id_name'),
            Index('ix_id_name', 'name', 'extra'),
        )
     
     
    # 一对多
    class Favor(Base):
        __tablename__ = 'favor'
        nid = Column(Integer, primary_key=True)
        caption = Column(String(50), default='red', unique=True)
     
     
    class Person(Base):
        __tablename__ = 'person'
        nid = Column(Integer, primary_key=True)
        name = Column(String(32), index=True, nullable=True)
        favor_id = Column(Integer, ForeignKey("favor.nid"))
     
     
    # 多对多
    class Group(Base):
        __tablename__ = 'group'
        id = Column(Integer, primary_key=True)
        name = Column(String(64), unique=True, nullable=False)
        port = Column(Integer, default=22)
     
     
    class Server(Base):
        __tablename__ = 'server'
     
        id = Column(Integer, primary_key=True, autoincrement=True)
        hostname = Column(String(64), unique=True, nullable=False)
     
     
    class ServerToGroup(Base):
        __tablename__ = 'servertogroup'
        nid = Column(Integer, primary_key=True, autoincrement=True)
        server_id = Column(Integer, ForeignKey('server.id'))
        group_id = Column(Integer, ForeignKey('group.id'))
     
     
    def init_db():
        Base.metadata.create_all(engine)
     
     
    def drop_db():
        Base.metadata.drop_all(engine)
    
    注:设置外键的另一种方式 ForeignKeyConstraint(['other_id'], ['othertable.other_id'])
    创建表

      

  • 相关阅读:
    编程自学网站
    SQL中Case语句用法
    SQL 综合应用(1.创建临时表,为后续查询所用) 实例_(学生,课程表,选修表)
    SQL 存储过程(学生,课程表,选修表)
    测试角度看公司流程规范对比后篇
    自动化测试技巧之图片验证
    QTP连载四:神一样的参数化方式?
    自动化测试之控件点击
    自动化测试技巧之结果验证
    自动化测试开展的条件
  • 原文地址:https://www.cnblogs.com/Michael--chen/p/7003342.html
Copyright © 2011-2022 走看看