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'])
    创建表

      

  • 相关阅读:
    准备 FRM 考试——方法、工具与教训
    930. 和相同的二元子数组 前缀和
    1906. 查询差绝对值的最小值 前缀和
    剑指 Offer 37. 序列化二叉树 二叉树 字符串
    815. 公交路线 BFS
    518. 零钱兑换 II dp 完全背包
    1049. 最后一块石头的重量 II dp
    5779. 装包裹的最小浪费空间 二分
    5778. 使二进制字符串字符交替的最少反转次数 字符串 滑动窗口
    474. 一和零 dp
  • 原文地址:https://www.cnblogs.com/Michael--chen/p/7003342.html
Copyright © 2011-2022 走看看