加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

SQLAlchemy ORM 基本使用方法

发布时间:2020-12-17 16:59:43 所属栏目:Python 来源:网络整理
导读:1.SQLAlchemy版本检查 import?sqlalchemyprint(sqlalchemy.__version__) 2.SQLAlchemy连接 2.1 使用create_engine连接SQLite数据库 from?sqlalchemy?import?create_engineengine?=?create_engine("sqlite:///:memory:",echo=True) echo=True????是设置SQLAlc

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)

常用的列选项

primary_key????设为True,改列是表的主键

unique????????????设为True,该列不允许出现重复的值

index???????????? ? 设为True,该列创建索引,提升查询效率

nullable? ?????????设为True,该列允许使用空值;反之不允许使用空值

default????????????设为True,为该列设置默认值

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()


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读