orm-sqlalchemy

1.ORM

在服务器后台,数据是要存储在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办呢?是不是需要把所有的 SQL 语句都再重新写一遍呢?

        

ORM

ORM全称 Object Relational Mapping对象关系映射

通过 ORM 可以不用关心后台是使用的哪种数据库,只需要按照 ORM 所提供的语法规则去书写相应的代码, ORM 就会自动的转换成对应对应数据库的 SQL 语句

2. SQLAlchemy连接数据库

第一步:安装

安装: mysql

安装python包: pymysql、sqlalchemy

pip安装 python 包

pip install -i https://pypi.douban.com/simple pymysql

pip install -i https://pypi.douban.com/simple sqlalchemy 这里是使用国内的源

创建/data目录,在下面创建connect.py文件

from sqlalchemy import create_engine  #第二步:导入模块

#第三步:数据库数据 USERNAME
= 'admin' PASSWORD = 'Root110qwe' HOST = '127.0.0.1' PORT = 3306 DATABASE = 'mydb' Db_url = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format( #第四步:数据连接 URL
    USERNAME,
    PASSWORD,
    HOST,
    PORT,
    DATABASE
)
engine = create_engine(Db_url) #第五步:连接数据库

if __name__ == '__main__':    #第六步:测试连接
    connection = engine.connect() #定义游标
    result = connection.execute('select 1')
    print(result.fetchone())

3.创建Module

第一步:创建 Module 的 Base 类

在connect.py文件中生成Base类

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base(engine) #数据库建模使用继承来建立

对象关系型映射,数据库中的表与python中的类相对应,创建的类必须继承自 sqlalchemy 中的基类。

使用 declarative 方法定义的映射类依据一个基类,这个基类是维系类和数据表关系的目录。

应用通常只需要有一个 Base 的实例。我们通过 declarative_base() 功能创建一个基类。

第二步:创建 Module

新增user_modules.py文件

#这个文件是用来建立模型
from connect import Base
from sqlalchemy import Column,Integer,String,DateTime,Boolean
from datetime import datetime

class User(Base):
    '''
    建立一个User模型,建立一张user表
    '''
    __tablename__ = 'user'
    id = Column(Integer,autoincrement=True,primary_key=True)
    username = Column(String(20))
    password = Column(String(20))
    create_time = Column(DateTime,default=datetime.now())
    _locked = Column(Boolean,default=False,nullable=False) #当前用户是否已经登录,是否还能登录

#第三步:创建 Module

if __name__ == '__main__':
    Base.metadata.create_all() #创建表格

再次强调,我们用类来表示数据库里面的表!!!

这些表的类都继承于我们的Base基类。

在类里面我们定义一些属性,这个属性通过映射,就对应表里面的字段

Module

__tablename__: 数据库中的表名

Column: 用来创建表中的字段的一个方法

Integer: 整形,映射到数据库中的int类型

String: 字符类型,映射到数据库中的varchar类型,使用时,需要提供一个字符长度

DateTime: 时间类型

4. 数据的增删改查

第一步:创建会话

在connect.py中添加

from  sqlalchemy.orm import sessionmaker

Session = sessionmaker(engine)  #生成一个会话类,用来操作数据
session = Session()

在对表数据进行增删改查之前,先需要建立会话,建立会话之后才能进行操作,就类似于文件要打开之后才能对文件内容操作

add

add 是添加一条数据, add_all 添加多条数据

query

query 就是查询的意思,在 SQLAlchemy 中也用来查询数据

all 是查询所有的意思

first 是查询第一条数据

在后面会详细介绍更过的用法

update

update更新是需要使用字典传值

delete

使用 delete 方法来删除数据

创建test_user_module.py文件。

from connect import session
from user_modules import User

def add_user():
    '''添加数据'''
    person = User(username='shiwei',password='1234')
    session.add_all([  #接收一个列表,添加多条,每一条是列表里面的一个元素
        User(username='塔卡',password='12341'),
        User(username='小泼',password='55432'),
        User(username='清空',password='12341'),
    ])
    # session.add(person)  #会默认开启一个事物,添加一条
    session.commit()  #提交事务

def search_user():
    '''查看数据'''
    rows = session.query(User).all()  #查询所有
    # rows = session.query(User).first()  #查询第一条
    print(rows)

def update_user():
    '''更新数据'''
    #更新是需要使用字典传值
    session.query(User).filter(User.username == '塔卡').update({User.password:'23115'})
    session.commit()

def delete_user():
    '''删除数据'''
    rows = session.query(User).filter(User.username == '式微')[0]  #需要使用索引取原生SQL值,不然会是
    print(rows)
    session.delete(rows)
    session.commit()

if __name__ == '__main__':
    delete_user()

执行查询search_user()时,会显示如下内容。需要对module模块进行重写__repr__

[<user_modules.User object at 0xb679104c>, <user_modules.User object at 0xb679190c>, <user_modules.User object at 0xb679194c>, <user_modules.User object at 0xb679198c>, <user_modules.User object at 0xb67919cc>]

class User(Base):
    '''
    建立一个User模型,建立一张user表
    '''
    __tablename__ = 'user'
    id = Column(Integer,autoincrement=True,primary_key=True)
    username = Column(String(20))
    password = Column(String(20))
    create_time = Column(DateTime,default=datetime.now())
    _locked = Column(Boolean,default=False,nullable=False) #当前用户是否已经登录,是否还能登录

    def __repr__(self):
        return '''
        <User(id=%s,username=%s,create_time=%s,_locked=%s)>
        '''%(self.id,self.username,self.password,self._locked)

重新运行search_user.py文件,展示结果如下,解析成容易读取的信息:

猜你喜欢

转载自www.cnblogs.com/taoge188/p/10640058.html