zoukankan      html  css  js  c++  java
  • flask_sqlalchemy和sqlalchemy联系区别及其使用方式

    ### 使用SQLAlchemy去连接数据库:

    1.使用SQLALchemy去连接数据库,需要使用一些配置信息,然后将他们组合成满足条件的字符串:
    HOSTNAME = '127.0.0.1'
    PORT = '3306'
    DATABASE = '1'
    USERNAME = 'root'
    PASSWORD = 'root'

    DB_URI = "mysql+mysqlconnector://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)

    2.然后使用`create_engine`创建一个引擎`engine`,
    engine = create_engine(DB_URI)

    3.构建session对象:所有和数据库的ORM操作都必须通过一个叫做`session`的会话对象来实现,通过以下代码来获取会话对象:
    from sqlalchemy.orm import sessionmaker

    engine = create_engine(DB_URI)
    session = sessionmaker(engine)()


    4.将ORM模型映射到数据库中:
    (1)用`declarative_base`根据`engine`创建一个ORM基类。
    from sqlalchemy.ext.declarative import declarative_base

    engine = create_engine(DB_URI)
    Base = declarative_base(engine)
    (2)用这个`Base`类作为基类来写自己的ORM类。要定义`__tablename__`类属性,来指定这个模型映射到数据库中的表名。
    class Person(Base):
        __tablename__ = 'person'
    (3)在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射。这些属性必须是sqlalchemy给我们提供好的数据类型。
    from sqlalchemy import create_engine,Column,Integer,String

    id = Column(Integer,primary_key=True,autoincrement=True)
    (4)使用`Base.metadata.create_all()`来将模型映射到数据库中。
    (5) 一旦使用`Base.metadata.create_all()`将模型映射到数据库中后,即使改变了模型的字段,也不会重新映射了。目前来说,只能删除这个表重新建了

    # Base.metadata.drop_all() # 删除这个表以及里面的数据
    # Base.metadata.create_all() # 新建表以及表结构

    ### 完整示例代码
    from sqlalchemy import create_engine,Column,Integer,String
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker

    HOSTNAME = '127.0.0.1'
    PORT = '3306'
    DATABASE = '1'
    USERNAME = 'root'
    PASSWORD = 'root'

    # dialect+driver://username:password@host:port/database
    DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)

    engine = create_engine(DB_URI)
    Base = declarative_base(engine)
    session = sessionmaker(engine)()

    class Person(Base):
        __tablename__ = 'person'
        id = Column(Integer,primary_key=True,autoincrement=True)
        name = Column(String(50))
        age = Column(Integer)
        country = Column(String(50))

    # Base.metadata.drop_all()
    # Base.metadata.create_all()

    # 新增多条数据
    p1 = Person(name='zhiliao1',age=19,country='china')
    p2 = Person(name='zhiliao2',age=20,country='china')
    session.add_all([p1,p2])
    session.commit()

    # 查询数据
    person = session.query(Person).first()
    print(person)


    ### 使用Flask-SQLAlchemy去连接数据库:
    1.数据库连接:
    (1)跟sqlalchemy一样,定义好数据库连接字符串DB_URI。
    (2)将这个定义好的数据库连接字符串DB_URI,通过`SQLALCHEMY_DATABASE_URI`这个键放到`app.config`中。
    示例代码:app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI
    (3)使用`flask_sqlalchemy.SQLAlchemy`这个类定义一个对象,并将`app`传入进去。
    示例代码:
    from flask_sqlalchemy import SQLAlchemy
    db = SQLAlchemy(app)

    2.创建ORM模型:
    还是跟使用sqlalchemy一样,定义模型。现在不再是需要使用`delarative_base`来创建一个基类。而是使用`db.Model`来作为基类。

    3.使用session:
    以后session也不需要使用`sessionmaker`来创建了。直接使用`db.session`就可以了。操作这个session的时候就跟之前的`sqlalchemy`的`session`是一模一样的。

    4.在模型类中,`Column`、`String`、`Integer`以及`relationship`等,都不需要导入了,直接使用`db`下面相应的属性名就可以了。
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)

    # 将ORM模型映射到数据库:
    1. db.drop_all()
    2. db.create_all()

    ### 完整示例代码
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy

    app = Flask(__name__)

    HOSTNAME = '127.0.0.1'
    PORT = '3306'
    DATABASE = '1'
    USERNAME = 'root'
    PASSWORD = 'root'

    DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)

    app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

    db = SQLAlchemy(app)

    class UserModel(db.Model):
        __tablename__ = 'user_model'
        id = db.Column(db.Integer,primary_key=True,autoincrement=True)
        username = db.Column(db.String(50),nullable=False)

        def __repr__(self):
            return "<User(username: %s)>" % self.username

    # db.drop_all()
    # db.create_all()

    class Article(db.Model):
        __tablename__ = 'article'
        id = db.Column(db.Integer,primary_key=True,autoincrement=True)
        title = db.Column(db.String(50),nullable=False)

    # 新增数据
    article = Article(title='title one')
    db.session.add(article)
    db.session.commit()

    # 查询数据
    article = Article.query.first()
    print(article)

  • 相关阅读:
    [洛谷P3674]小清新人渣的本愿
    [洛谷P2698][USACO12MAR]花盆Flowerpot
    [洛谷P4329][COCI2006-2007#1] Bond
    [洛谷P3203][HNOI2010]弹飞绵羊
    [洛谷P1407][国家集训队]稳定婚姻
    [洛谷P3388]【模板】割点(割顶)
    TX2_安装view_team
    tx2的一些系统命令
    tensorflow-cnnn-mnist
    mnist数据集tensorflow实现
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/10219087.html
Copyright © 2011-2022 走看看