9、ORM框架------SQLAlchemy(1)

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()
渐变 --> 突变
原文地址:https://www.cnblogs.com/lybpy/p/8046670.html