SQLAlchemy教程-第一章-基礎模型
阿新 • • 發佈:2018-06-30
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映射數據庫裏面的表, 實現模型創建.
- 在這裏要做一下預備工作.
先把代碼放上來.
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
SQLAlchemy教程-第一章-基礎模型