ORM:对象关系映射
SQLAlchemy是code first
而django中的orm既有code first(先有类),又有db first(先有数据库及表)
安装:
sudo apt install python3-pip
pip3 install sqlalchemy #只负责将类及对象转换为sql语句
pip3 install pymysql #负责连接mysql并执行sql语句,其它还有mysqldb
创建数据库表:
from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Index,Integer,UniqueConstraint,String,ForeignKey engine = create_engine("mysql+pymysql://root:w@127.0.0.1:3306/study?charset=utf8",echo=True,max_overflow=5)
#engine用于设置连接,echo在进行数据库表操作时,是否显示过程,可以不写;max_overflow最大连接数,不写默认是5。注意编码的写法! Base = declarative_base()
#生成orm基类,之后的类都要继承它 class UserType(Base): __tablename__ = 'usertype' #表名,小写 id = Column(Integer,primary_key=True,autoincrement=True) title = Column(String(50)) class Users(Base): __tablename__ = 'users' id = Column(Integer,primary_key=True,autoincrement=True) name = Column(String(32),nullable=True,default='lyb',unique=True) email = Column(String(16),index=True) user_type_id = Column(Integer,ForeignKey('usertype.id')) __table_args__ = ( UniqueConstraint('name','email',name='uix_name_email'), #组合索引 ) Base.metadata.create_all(engine)
#创建表,此时运行脚本,在数据库中会创建继承了Base的表。另外再次运行时不会重复创建,也不会报错
# Base.metadata.drop_all(engine)
删除表
数据的增删改查: 在query.py模块中
创建会话:
from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) # 绑定连接引擎,创建会话类,注意返回的类,不是实例 sess = Session() # 此时才生成会话实例
增:
obj1 = UserType(title='普通用户1') obj2 = UserType(title='白金用户2') obj3 = UserType(title='超级用户3') # 创建数据对象,对象 == 数据行,类 == 表 sess.add_all([obj1,obj2,obj3]) # 将数据添加到会话,一次多个,也可以一次一个用add(obj1) sess.commit() # 统一提交并创建数据
另一种增法:还可以把下面的合并为一个迭代
type = ['普通','白金','黑金','超级'] for item in type: sess.add(UserType(title=item)) user = [('qqq',2),('eee',1),('ddd',2),('rrr',4)] for item in user: sess.add(User(name=item[0],usertype_id=item[1])) sess.commit()
查:
# q_list1 = sess.query(UserType).all() # for row in q_list1: # print(row.id,row.title) q_list2 = sess.query(UserType).filter(UserType.id!=2) # >, >=, <, <=,==,!= for row in q_list2: print(row.id,row.title)
#或,直接用关键字
q_list2 = sess.query(UserType).filter_by(id=2,title='普通用户')
直接查询:
from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker engine = create_engine('mysql+pymysql://root:w@127.0.0.1:3306/lx?charset=utf8') Session = sessionmaker(bind=engine) sess = Session() res = sess.execute('select NAME ,type from USER LEFT JOIN usertype ON typeid=tid') for i in res: print(i[0],i[1])
qqq 普通
lll 白银
rew 白银
yue 黑金
cvb 超级
删:注意需要提交
sess.query(UserType.id,UserType.title).filter(UserType.id<=2).delete()
sess.commit()
改:
#满足条件的title全改为‘用户’
sess.query(UserType.id,UserType.title).filter(UserType.id>=5).update({'title':'用户'}) sess.commit()
#满足添加的title的值后全部加上‘x’。字符串情况
sess.query(UserType.id,UserType.title).filter(UserType.id>=5).update({UserType.title: UserType.title + 'x'}, synchronize_session=False) sess.commit()
#数字情况
sess.query(UserType.id,UserType.title).filter(UserType.id>=5).update({UserType.title: UserType.title - 2}, synchronize_session='evaluate') sess.commit()