zoukankan      html  css  js  c++  java
  • 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文件,展示结果如下,解析成容易读取的信息:

  • 相关阅读:
    Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA
    mysql使用instr
    swagger错误:Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body
    java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result异常的解决方法
    平行四边形
    transition
    transform
    box-shadow
    text-shadow文字阴影
    linear-gradient线性渐变
  • 原文地址:https://www.cnblogs.com/taoge188/p/10640058.html
Copyright © 2011-2022 走看看