SQLAlchemy ORM 基本使用方法

 Pala   2017-07-05 20:00   132 人阅读  0 条评论

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

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, Integer, String

Base = declarative_base()


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)


Base.metadata.create_all(engine)

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:\flask\shengdeye\spider\data.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, Integer, String

Base = declarative_base()


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


本文地址:http://chenxm.cc/post/30.html
版权声明:本文为原创文章,版权归 Pala 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?