1. 程式人生 > >SQLAlchemy教程-第一章-基礎模型

SQLAlchemy教程-第一章-基礎模型

name sql數據庫 mil mysql ren 員工 resid oracle 部門

今天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

SQLAlchemy教程-第一章-基礎模型