一、什么是SQLAchemy?
SQLAlchemy是编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
1、安装SQLAlchemy
pip3 install SQLAlchemy
SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
MySQL-Python mysql+mysqldb://用户名:密码(无密码为空)@[: ]/ pymysql mysql+pymysql://用户名:密码(无密码为空)@ / [? ] MySQL-Connector mysql+mysqlconnector://用户名:密码(无密码为空)@ [: ]/ 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_basefrom sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Indexfrom sqlalchemy.orm import sessionmaker, relationshipfrom 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'])