SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
!!!上述流程分析,可以大致分为两个阶段!!!:
如果我们不依赖于SQLAlchemy的转换而自己写好sql语句,那是不是意味着可以直接从第二个阶段开始执行了,事实上正是如此,我们完全可以只用SQLAlchemy执行纯sql语句,如下
| from sqlalchemy import create_engine |
| |
| |
| |
| |
| |
| |
| egine=create_engine('mysql+pymysql://root@127.0.0.1/db1?charset=utf8') |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| cur=egine.execute('select * from t1') |
| |
| cur.fetchone() |
| cur.fetchmany(2) |
| cur.fetchall() |
SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
| |
| mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname> |
| |
| |
| mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>] |
| |
| |
| mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname> |
| |
| |
| oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...] |
| |
| 更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html |
ORM中:
四张表:业务线,服务,用户,角色,利用ORM创建出它们,并建立好它们直接的关系
| from sqlalchemy import create_engine |
| from sqlalchemy.ext.declarative import declarative_base |
| from sqlalchemy import Column,Integer,String,DateTime,Enum,ForeignKey,UniqueConstraint,ForeignKeyConstraint,Index |
| from sqlalchemy.orm import sessionmaker |
| |
| egine=create_engine('mysql+pymysql://root@127.0.0.1:3306/db1?charset=utf8',max_overflow=5) |
| |
| Base=declarative_base() |
| |
| |
| class Business(Base): |
| __tablename__='business' |
| id=Column(Integer,primary_key=True,autoincrement=True) |
| bname=Column(String(32),nullable=False,index=True) |
| |
| |
| class Service(Base): |
| __tablename__='service' |
| id=Column(Integer,primary_key=True,autoincrement=True) |
| sname=Column(String(32),nullable=False,index=True) |
| ip=Column(String(15),nullable=False) |
| port=Column(Integer,nullable=False) |
| |
| business_id=Column(Integer,ForeignKey('business.id')) |
| |
| __table_args__=( |
| UniqueConstraint(ip,port,name='uix_ip_port'), |
| Index('ix_id_sname',id,sname) |
| ) |
| |
| |
| class Role(Base): |
| __tablename__='role' |
| id=Column(Integer,primary_key=True,autoincrement=True) |
| rname=Column(String(32),nullable=False,index=True) |
| priv=Column(String(64),nullable=False) |
| |
| business_id=Column(Integer,ForeignKey('business.id'),unique=True) |
| |
| |
| class Users(Base): |
| __tablename__='users' |
| id=Column(Integer,primary_key=True,autoincrement=True) |
| uname=Column(String(32),nullable=False,index=True) |
| |
| class Users2Role(Base): |
| __tablename__='users2role' |
| id=Column(Integer,primary_key=True,autoincrement=True) |
| uid=Column(Integer,ForeignKey('users.id')) |
| rid=Column(Integer,ForeignKey('role.id')) |
| |
| __table_args__=( |
| UniqueConstraint(uid,rid,name='uix_uid_rid'), |
| ) |
| |
| def init_db(): |
| Base.metadata.create_all(egine) |
| |
| def drop_db(): |
| Base.metadata.drop_all(egine) |
| |
| if __name__ == '__main__': |
| init_db() |
注:设置外键的另一种方式 ForeignKeyConstraint([‘other_id’],[‘othertable.other_id’])
表结构
| from sqlalchemy import create_engine |
| from sqlalchemy.ext.declarative import declarative_base |
| from sqlalchemy import Column,Integer,String,ForeignKey |
| from sqlalchemy.orm import sessionmaker |
| |
| egine=create_engine('mysql+pymysql://root@127.0.0.1:3306/db1?charset=utf8',max_overflow=5) |
| |
| Base=declarative_base() |
| |
| |
| class Dep(Base): |
| __tablename__='dep' |
| id=Column(Integer,primary_key=True,autoincrement=True) |
| dname=Column(String(64),nullable=False,index=True) |
| |
| class Emp(Base): |
| __tablename__='emp' |
| id=Column(Integer,primary_key=True,autoincrement=True) |
| ename=Column(String(32),nullable=False,index=True) |
| dep_id=Column(Integer,ForeignKey('dep.id')) |
| |
| def init_db(): |
| Base.metadata.create_all(egine) |
| |
| def drop_db(): |
| Base.metadata.drop_all(egine) |
| |
| drop_db() |
| init_db() |
| Session=sessionmaker(bind=egine) |
| session=Session() |
增
| |
| row_obj=Dep(dname='销售') |
| session.add(row_obj) |
| session.add_all([ |
| Dep(dname='技术'), |
| Dep(dname='运营'), |
| Dep(dname='人事'), |
| ]) |
| |
| session.commit() |
删
| |
| |
| session.query(Dep).filter(Dep.id > 3).delete() |
| session.commit() |
改
| |
| session.query(Dep).filter(Dep.id > 0).update({'dname':'哇哈哈'}) |
| session.query(Dep).filter(Dep.id > 0).update({'dname':Dep.dname+'_SB'},synchronize_session=False) |
| session.query(Dep).filter(Dep.id > 0).update({'id':Dep.id*100},synchronize_session='evaluate') |
| |
| session.commit() |
查
| |
| res=session.query(Dep).all() |
| |
| |
| res=session.query(Dep.dname).order_by(Dep.id).all() |
| |
| res=session.query(Dep.dname).first() |
| print(res) |
| |
| |
| res=session.query(Dep).filter(Dep.id > 1,Dep.id <1000) |
| print([(row.id,row.dname) for row in res]) |
| 复制代码 |
| |
| from sqlalchemy import create_engine |
| from sqlalchemy.ext.declarative import declarative_base |
| from sqlalchemy import Column,Integer,String,ForeignKey |
| from sqlalchemy.orm import sessionmaker |
| |
| egine=create_engine('mysql+pymysql://root@127.0.0.1:3306/db1?charset=utf8',max_overflow=5) |
| |
| Base=declarative_base() |
| |
| |
| class Dep(Base): |
| __tablename__='dep' |
| id=Column(Integer,primary_key=True,autoincrement=True) |
| dname=Column(String(64),nullable=False,index=True) |
| |
| class Emp(Base): |
| __tablename__='emp' |
| id=Column(Integer,primary_key=True,autoincrement=True) |
| ename=Column(String(32),nullable=False,index=True) |
| dep_id=Column(Integer,ForeignKey('dep.id')) |
| |
| def init_db(): |
| Base.metadata.create_all(egine) |
| |
| def drop_db(): |
| Base.metadata.drop_all(egine) |
| |
| drop_db() |
| init_db() |
| Session=sessionmaker(bind=egine) |
| session=Session() |
| |
| |
| session.add_all([ |
| Dep(dname='技术'), |
| Dep(dname='销售'), |
| Dep(dname='运营'), |
| Dep(dname='人事'), |
| ]) |
| |
| session.add_all([ |
| Emp(ename='林海峰',dep_id=1), |
| Emp(ename='李杰',dep_id=1), |
| Emp(ename='武配齐',dep_id=1), |
| Emp(ename='元昊',dep_id=2), |
| Emp(ename='李钢弹',dep_id=3), |
| Emp(ename='张二丫',dep_id=4), |
| Emp(ename='李坦克',dep_id=2), |
| Emp(ename='王大炮',dep_id=4), |
| Emp(ename='牛榴弹',dep_id=3) |
| ]) |
| |
| session.commit() |