zoukankan      html  css  js  c++  java
  • SQLAlchemy教程-第一章-基础模型

    今天2018-06-29, 先构建好模型.

    创建数据表

    我们采用先建好数据库和表的方式. 需要先有一个可用的 mysql数据库. 可以自己安装一个mysql数据库.
    数据模型, 我依然采用oracle数据自带的实例 员工和部门表.

    SQL语句, 我已经根据mysql的语法改造好了, 直接可以运行.
    这个教程所有的源码都在github上面. 仓库地址是: https://github.com/notfresh/sqlalchemy_demo

    -- 部门 表
    -- Create table
    create table DEPT
    (
    deptno int(2) not null,
    dname varchar(14),
    loc varchar(13)
    )
    ;
    -- Create/Recreate primary, unique and foreign key constraints
    alter table DEPT
    add constraint PK_DEPT primary key (DEPTNO);
    
    insert into dept (DEPTNO, DNAME, LOC)
    values (10, 'ACCOUNTING', 'NEW YORK');
    
    insert into dept (DEPTNO, DNAME, LOC)
    values (20, 'RESEARCH', 'DALLAS');
    
    insert into dept (DEPTNO, DNAME, LOC)
    values (30, 'SALES', 'CHICAGO');
    
    insert into dept (DEPTNO, DNAME, LOC)
    values (40, 'OPERATIONS', 'BOSTON');
    
    -- 员工表
    create table EMP
    (
    empno int(4) not null,
    ename varchar(10),
    job varchar(9),
    mgr int(4),
    hiredate DATE,
    sal DECIMAL(7,2),
    comm DECIMAL(7,2),
    deptno int(2),
    desc2 varchar(30) default 2
    )
    ;
    -- Create/Recreate primary, unique and foreign key constraints
    alter table EMP
    add constraint PK_EMP primary key (EMPNO);
    alter table EMP
    add constraint FK_DEPTNO foreign key (DEPTNO)
    references DEPT (DEPTNO);
    
    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DESC2)
    values (7369, 'SMITH', 'CLERK', 7902, str_to_date('17-12-1980', '%d-%m-%Y'), 800.00, 1999.00, 20, null);
    
    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DESC2)
    values (7499, 'ALLEN', 'SALESMAN', 7698, str_to_date('20-02-1981', '%d-%m-%Y'), 1600.00, 300.00, 30, null);
    
    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DESC2)
    values (7521, 'WARD', 'SALESMAN', 7698, str_to_date('22-02-1981', '%d-%m-%Y'), 1250.00, 500.00, 30, null);
    
    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DESC2)
    values (7566, 'JONES', 'MANAGER', 7839, str_to_date('02-04-1981', '%d-%m-%Y'), 2975.00, null, 20, null);
    
    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DESC2)
    values (7654, 'MARTIN', 'SALESMAN', 7698, str_to_date('28-09-1981', '%d-%m-%Y'), 1250.00, 1400.00, 30, null);
    
    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DESC2)
    values (7698, 'BLAKE', 'MANAGER', 7839, str_to_date('01-05-1981', '%d-%m-%Y'), 2850.00, null, 30, null);
    
    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DESC2)
    values (7782, 'CLARK', 'MANAGER', 7839, str_to_date('09-06-1981', '%d-%m-%Y'), 2450.00, null, 10, null);
    
    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DESC2)
    values (7788, 'SCOTT', 'ANALYST', 7566, str_to_date('19-04-1987', '%d-%m-%Y'), 3000.00, null, 20, null);
    
    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DESC2)
    values (7839, 'KING', 'PRESIDENT', null, str_to_date('17-11-1981', '%d-%m-%Y'), 5000.00, null, 10, null);
    
    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DESC2)
    values (7844, 'TURNER', 'SALESMAN', 7698, str_to_date('08-09-1981', '%d-%m-%Y'), 1500.00, 0.00, 30, null);
    
    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DESC2)
    values (7876, 'ADAMS', 'CLERK', 7788, str_to_date('23-05-1987', '%d-%m-%Y'), 1100.00, null, 20, null);
    
    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DESC2)
    values (7900, 'JAMES', 'CLERK', 7698, str_to_date('03-12-1981', '%d-%m-%Y'), 950.00, null, 30, null);
    
    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DESC2)
    values (7902, 'FORD', 'ANALYST', 7566, str_to_date('03-12-1981', '%d-%m-%Y'), 3000.00, null, 20, null);
    
    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DESC2)
    values (7934, 'MILLER', 'CLERK', 7782, str_to_date('23-01-1982', '%d-%m-%Y'), 1300.00, null, 10, null);
    
    insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, DESC2)
    values (7935, 'KATE', 'MANAGER', null, null, null, null, null, null);
    

    模型创建

    使用SQLAlchemy映射数据库里面的表, 实现模型创建.

    1. 在这里要做一下预备工作.
      先把代码放上来.
      db_util.py:
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    
    # 声明一个基类, 所有的模型都需要绑定在这个基类上面, 才能创建到数据库里面去, 而且以只有通过模型才能查询数据库. 
    # 本次我们先创建表, 但是这个基类依然是必不可少的.
    Base = declarative_base()  
    
    engine = create_engine('mysql+pymysql://MYSQL_USER:MYSQL_USER_PWD@localhost:3306/sqlalchemy_demo?charset=utf8')   #初学者只需要知道这段是mysql的连接地址
    Session = sessionmaker(bind=engine)
    
    if __name__ == '__main__':
        # 创建表,如果不存在的话
        Base.metadata.create_all(engine)
    
    1. 接着我们创建模型.
      我们创建另一个文件, 同样, 我们把代码贴上来.
      models.py:
    from sqlalchemy import Column, Integer, String
    from db_util import Base, Session
    
    sess = Session()
    
    class Dept(Base):
        __tablename__ = 'dept'  # __tablename__指明了数据表实际的名字, 一定要和数据库里的表名字匹配.
        deptno = Column(Integer, primary_key=True)  # 第一个字段指明数据类型. 第二个字段表明它是主键.
        dname = Column(String(14))
        loc = Column(String(13))
    
        def __repr__(self):
            return str({
                'deptno': self.deptno,
                'dname': self.dname,
                'loc': self.loc
            })
    

    本次, 我们先创建一个叫Dept的类, 映射 dept部门表. 对字段不熟悉的请往上翻sql脚本.
    接下来, 我们通过简单的语句展示我们的劳动成果.

    我们进入python命令行模式, 通过即时反馈来验证我们的代码是否预期完成. 但是我这里建议使用加强版的python命令行工具, IPython.(请同学自行了解iPython的强大之处)
    先创建虚拟环境.( 我本机开发使用的是 unix like系统, 有时候会用mac, 有时候会用linux的ubuntu.) (虚拟环境的必要性, 请同学们自行了解), 创建完虚拟环境之后使用pip安装 ipython.
    输入ipython进入命令行模式.

    (venv) ➜  SQLAlchemy_demo git:(master) ✗ ipython
    In [1]: from models import *    # 先导入编辑好的代码.
    
    In [2]: Dept  # 查看是否导入成功.
    Out[2]: models.Dept
    
    In [3]: sess
    Out[3]: <sqlalchemy.orm.session.Session at 0x105f6ee48>
    
    In [4]: sess.query(Dept).first()
    Out[4]: {'deptno': 10, 'dname': 'ACCOUNTING', 'loc': 'NEW YORK'}
    

    OK, 我们已经看到成功的查询到了第一个部门!!
    本次时间比较紧促, 讲解较为粗劣. 后面的我们会继续深入了解 sqlalchemy.


    SQLAlchemy官方网站
    http://docs.sqlalchemy.org/en/latest/contents.html

  • 相关阅读:
    如何使用Redis实现分布式缓存
    如何使用Swagger生成API文档
    Asp.Net Core WebApi入门
    如何使用Entity Framework Core实现增删改查(CRUD)
    Microsoft.Extensions.DependencyInjection入门
    什么是中介者模式
    什么是依赖注入
    什么是事件总线
    点滴智慧
    并查集
  • 原文地址:https://www.cnblogs.com/notfresh/p/9246542.html
Copyright © 2011-2022 走看看