一、什么是SQLAchemy?
SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
1、安装SQLAlchemy
pip3 install SQLAlchemy
SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
MySQL-Python mysql+mysqldb://用户名:密码(无密码为空)@<host>[:<port>]/<dbname> pymysql mysql+pymysql://用户名:密码(无密码为空)@<host>/<dbname>[?<options>] MySQL-Connector mysql+mysqlconnector://用户名:密码(无密码为空)@<host>[:<port>]/<dbname> cx_Oracle oracle+cx_oracle://用户名:密码(无密码为空)@host:port/dbname[?key=value&key=value...] 更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html
二、ORM的使用机制
orm 通过 Engine/ConnectionPooling/Dialect 进行数据库操作,Engine使用ConnectionPooling连接数据库,然后再通过Dialect执行SQL语句。

from sqlalchemy import create_engine # 基于pymysql连接数据库 engine=create_engine("mysql+pymysql://root:@127.0.0.1:3306/db4?charset=utf8",max_overflow=5) # 创造出类 Session=sessionmaker(bind=engine) # 实例化出对象 session=Session() # 对象的方法 #1、增: # 增加一行数据: obj=表名(列名1=值1,列名2=值2...) session.add(obj) # 增加多行数据: objs=[ 表名(列名1=值1,列名2=值2...), 表名(列名1=值1,列名2=值2...), 表名(列名1=值1,列名2=值2...), ... ] session.add_all(objs) #2、删: session.query(表名).delete() session.query(表名).filter(条件表达式).delete() #3、改: session.query(表名).filter(条件表达式).update({"列名1":"更新的值1", "列名2":"更新的值2",...}) session.query(表名).filter(条件表达式).update({表名.列名1:值1+"str1", 表名.列名2:值2+"str2",...},synchronize_session=False) #支持字符串拼接 session.query(表名).filter(条件表达式).update({表名.列名1:num1+1, 表名.列名2:num2+1,...},synchronize_session=evaluate) #支持值为数字的数学运算 #4、 查: 变量名=session.query(表名).filter(条件表达式).all() for row in 变量名: print(row.列名1,row.列名2...)
使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有组件对数据进行操作。根据类创建对象,对象转换成SQL,执行SQL。

from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5) Base = declarative_base() # 创建单表 class Users(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(32)) extra = Column(String(16)) __table_args__ = ( UniqueConstraint('id', 'name', name='uix_id_name'), Index('ix_id_name', 'name', 'extra'), ) # 一对多 class Favor(Base): __tablename__ = 'favor' nid = Column(Integer, primary_key=True) caption = Column(String(50), default='red', unique=True) class Person(Base): __tablename__ = 'person' nid = Column(Integer, primary_key=True) name = Column(String(32), index=True, nullable=True) favor_id = Column(Integer, ForeignKey("favor.nid")) # 多对多 class Group(Base): __tablename__ = 'group' id = Column(Integer, primary_key=True) name = Column(String(64), unique=True, nullable=False) port = Column(Integer, default=22) class Server(Base): __tablename__ = 'server' id = Column(Integer, primary_key=True, autoincrement=True) hostname = Column(String(64), unique=True, nullable=False) class ServerToGroup(Base): __tablename__ = 'servertogroup' nid = Column(Integer, primary_key=True, autoincrement=True) server_id = Column(Integer, ForeignKey('server.id')) group_id = Column(Integer, ForeignKey('group.id')) def init_db(): Base.metadata.create_all(engine) def drop_db(): Base.metadata.drop_all(engine) 注:设置外键的另一种方式 ForeignKeyConstraint(['other_id'], ['othertable.other_id'])