Python之路51-sqlalchemy

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之路51-sqlalchemy相关的知识,希望对你有一定的参考价值。

ORM介绍

orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言。


orm的优点:

隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。

ORM使我们构造固化数据结构变得简单易行。

缺点:

无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。


sqlalchemy安装

pip install SQLAlchemy

pip install pymysql


sqlalchemy基本使用

先创建一个表

CREATE TABLE user (
    id INTEGER NOT NULL AUTO_INCREMENT,
    name VARCHAR(32),
    password VARCHAR(64),
    PRIMARY KEY (id)
)


使用sqlalchemy实现同样的功能

创建user表

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python",
                       encoding="utf-8",
                       echo=True)

Base = declarative_base()   # 生成orm基类


class User(Base):
    __tablename__ = "user"  # 表明
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

Base.metadata.create_all(engine)    # 创建表结构


user表已经创建好了,那我们开始用orm创建一条数据试试

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

# 创建user表
engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python",
                       encoding="utf-8")

Base = declarative_base()   # 生成orm基类


class User(Base):
    __tablename__ = "user"  # 表名
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

Base.metadata.create_all(engine)    # 创建表结构

Session_class = sessionmaker(bind=engine)   # 创建与数据库的会话session class,注意,这里返回给session的是个class,不是实例
Session = Session_class()                   # 生成session实例

user_obj = User(name="Rain", password="1111111")     # 生成你要创建的数据对象
# print(user_obj.name, user_obj.password)             # 此时还没创建对象呢,不信你打印一下id发现还是None

Session.add(user_obj)                               # 把要创建的数据对象添加到这个session里,一会统一创建
# print(user_obj.name, user_obj.id)                   # 此时也依然还没创建

Session.commit()                                    # 现在才统一提交,创建数据


查询

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python",
                       encoding="utf-8")
                       
Base = declarative_base()

class User(Base):
    __tablename__ = "user"  # 表明
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

    def __repr__(self):
        return "<User(name=‘%s‘, password=‘%s‘)>" % (self.name, self.password)

data = Session.query(User).filter(User.name=="Tom").all()    # 查询user表中name为Tom的,所有信息
data = Session.query(User).filter_by(name="Tom").all()       # 查询user表中name为Tom的,所有信息
data = Session.query(User.name).filter(User.id > 3).all()    # 查询user表中id大于3的,name
data = Session.query(User).filter(User.id > 0).filter(User.id < 3).all()    # 多条件查询
data = Session.query(User).filter(User.id > 0).filter(User.name == "Tom").all()
print(data)


修改数据

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

# # 创建user表
engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python",
                       encoding="utf-8")

Base = declarative_base()   # 生成orm基类


class User(Base):
    __tablename__ = "user"  # 表明
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

    def __repr__(self):
        return "<User(name=‘%s‘, password=‘%s‘)>" % (self.name, self.password)

Session_class = sessionmaker(bind=engine)   # 创建与数据库的会话session class,注意,这里返回给session的是个class,不是实例
Session = Session_class()                   # 生成session实例

data = Session.query(User).filter_by(name="Tom").first()
data.name = "Ben"
Session.commit()


删除数据

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

# 创建user表
engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python",
                       encoding="utf-8")

Base = declarative_base()   # 生成orm基类


class User(Base):
    __tablename__ = "user"  # 表明
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

    def __repr__(self):
        return "<User(name=‘%s‘, password=‘%s‘)>" % (self.name, self.password)

Session_class = sessionmaker(bind=engine)   # 创建与数据库的会话session class,注意,这里返回给session的是个class,不是实例
Session = Session_class()                   # 生成session实例

data = Session.query(User).filter_by(name="Ben").first()
Session.delete(data)
Session.commit()


统计

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

# 创建user表
engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python",
                       encoding="utf-8")

Base = declarative_base()   # 生成orm基类


class User(Base):
    __tablename__ = "user"  # 表明
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

    def __repr__(self):
        return "<User(name=‘%s‘, password=‘%s‘)>" % (self.name, self.password)

Session_class = sessionmaker(bind=engine)   # 创建与数据库的会话session class,注意,这里返回给session的是个class,不是实例
Session = Session_class()                   # 生成session实例

data = Session.query(User).filter(User.name.like("Ra%")).count()
print(data)


分组

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy import func

# 创建user表
engine = create_engine("mysql+pymysql://root:@127.0.0.1/learn_python",
                       encoding="utf-8")

Base = declarative_base()   # 生成orm基类


class User(Base):
    __tablename__ = "user"  # 表明
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

    def __repr__(self):
        return "<User(name=‘%s‘, password=‘%s‘)>" % (self.name, self.password)

Session_class = sessionmaker(bind=engine)   # 创建与数据库的会话session class,注意,这里返回给session的是个class,不是实例
Session = Session_class()                   # 生成session实例

data = Session.query(func.count(User.name), User.name).group_by(User.name).all()
print(data)


本文出自 “八英里” 博客,请务必保留此出处http://5921271.blog.51cto.com/5911271/1913920

以上是关于Python之路51-sqlalchemy的主要内容,如果未能解决你的问题,请参考以下文章

《Python学习之路 -- Python基础之切片》

[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段

python成长之路第三篇_正则表达式

python成长之路第三篇_正则表达式

机器学习之路: python 实践 word2vec 词向量技术

深入浅出Flask(51):flask_sqlalchemy的增删查改