SQLAlchemy ORM 基本使用方法
1.SQLAlchemy版本检查
import?sqlalchemy print(sqlalchemy.__version__) 2.SQLAlchemy连接 2.1 使用create_engine连接SQLite数据库 from?sqlalchemy?import?create_engine engine?=?create_engine("sqlite:///:memory:",echo=True) echo=True????是设置SQLAlchemy日志记录的快捷方式(基于Loggin模块实现),启用之后,可以打印的所有SQL语句。 echo=Fasle???不打印SQL语句 不同的数据库连接方式可参考:Engine Configuration 3.SQLAlchemy创建表????声明映射(Declare a Mapping) 使用declarative_base()函数创建基类: from?sqlalchemy.ext.declarative?import?declarative_base Base?=?declarative_base() 创建User表: class?User(Base): ????__tablename__?=?"users" ????id?=?Column(Integer,?primary_key=True) ????name?=?Column(String) ????password?=?Column(String) ????fullname?=?Column(String) ????def?__repr__(self): ????????return?"<User(name='{}',fullname='{}',password='{}')".format(self.name,?????????????????????????????????????????????????????????????????????self.fullname,?????????????????????????????????????????????????????????????????????self.password) 常用的列选项
4.SQLAlchemy创建表? 创建一个模式(Create a Schema) 创建表代码示例: import?os from?sqlalchemy?import?create_engine from?sqlalchemy.ext.declarative?import?declarative_base from?sqlalchemy?import?Column,?Integer,?String base_dir=os.path.abspath(os.path.dirname(__file__)) engine?=?create_engine("sqlite:///{}/db.sqlite3".format(base_dir),?echo=False) Base?=?declarative_base() class?User(Base): ????__tablename__?=?"users" ????id?=?Column(Integer,?????????????????????????????????????????????????????????????????????self.password) Base.metadata.create_all(engine) 参数 sqlite:///foo.db 解释为: sqlite://<nohostname>/<path> Base.metadata.create_all(engine)这一行代码会检查users表是否存在,如果存在,则跳过运行,不存在创建users表。 注意:Base.metadata.create_all(engine)这一行必须要放在表的类的下面,否者会运行错误。 5.SQLAlchemy创建会话 5.1 使用create_engine()和数据库会话,首先定义一个Session类,将做为新Session对象的工厂: from?sqlalchemy.orm?import?sessionmaker Session?=?sessionmaker(bind=engine) 5.2 如果你的应用尚未使用Engine定义模块级对象的情况下,设置如下: Session?=??sessionmaker() 5.2.1 然后,当你创建引擎create_engine(),连接到Session使用configre(): Session.configure(bind=engine) 5.2.2 使用自定义类构造新的Session session?=?Session() 6.SQLAlchemy往表进行数据添加和更新 user表添加数据代码示例: import?os from?sqlalchemy?import?create_engine #?engine?=?create_engine(r"sqlite:///I:flaskshengdeyespiderdata.sqlite",?echo=True) engine?=?create_engine("sqlite:///{}/data".format(os.path.abspath(os.path.dirname(__file__))),?echo=False) from?sqlalchemy.ext.declarative?import?declarative_base from?sqlalchemy?import?Column,?String Base?=?declarative_base() class?User(Base): ????__tablename__?=?"users" ????id?=?Column(Integer,?????????????????????????????????????????????????????????????????????self.password) ???? Base.metadata.create_all(engine) from?sqlalchemy.orm?import?sessionmaker Session?=?sessionmaker(bind=engine) session?=?Session() ed_user?=?User(name='ed',?fullname='Ed?Jones',?password='edspassword') session.add(ed_user) session.commit() 注意:为了把对象写入数据库,.add()方法之后,必须要使用.commit()方法提交会话。 session.add_all()???????? ?把多个对象添加到数据库 session.delete()????????? ?删除行 session.rollback()????????数据库会话回滚,添加到数据库会话中对的所有对象都会还原到它们在数据库时的状态 7. 数据查询 #获取所有数据 session.query(Person).all() #获取某一列数据,类似于django的get,如果返回数据为多个则报错 session.query(Person).filter(Person.name=='jack').one() #获取返回数据的第一行 session.query(Person).first() #过滤数据 session.query(Person.name).filter(Person.id>1).all() #limit session.query(Person).all()[1:3] #order?by session.query(Person).ordre_by(-Person.id) #equal/like/in query?=?session.query(Person) query.filter(Person.id==1).all() query.filter(Person.id!=1).all() query.filter(Person.name.like('%ac%')).all() query.filter(Person.id.in_([1,2,3])).all() query.filter(~Person.id.in_([1,3])).all() query.filter(Person.name==None).all() #and?or from?sqlalchemy?import?and_ query.filter(and_(Person.id==1,?Person.name=='jack')).all() query.filter(Person.id==1,?Person.name=='jack').all() query.filter(Person.id==1).filter(Person.name=='jack').all() from?sqlalchemy?import?or_ query.filter(or_(Person.id==1,?Person.id==2)).all() 8. 计数 Query使用count()函数来实现查询计数。 session.query.filter(Person.id>1).count() group by的用法 from?sqlalchemy?import?func session.query(func.count(Person.name),?Person.name),group_by(Person.name).all() 实现count(*)来查询表内行数 from?sqlalchemy?import?func session.query(func.count('*')).select_from(Person).scalar() session.query(func.count(Person.id)).scalar() 使用该方法比使用.count()更加快。 使用func.count()比count()快的原因: ????count()方法被用于确定返回的结果集中有多少行,让我们观察一下产生的SQL语句,SQLAlchemy先是取出符合条件的所有行集合,然后再通过SELECT count(*)来统计有多少行。 ????这个就是遍历完数据库所有记录以后,再select count(*).是很恐怖的,当数据量大的时候,低于100W都不算大吧。当然时间是全部花在了遍历上边. ????我们可以通过表达式func.count()直接使用count函数。-----这个就是相当于数据库中的直接count() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |