今天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映射数据库里面的表, 实现模型创建.
- 在这里要做一下预备工作.
先把代码放上来.
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)
- 接着我们创建模型.
我们创建另一个文件, 同样, 我们把代码贴上来.
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