本教材由知了传课辛苦制作而成,仅供学习使用,请勿用于商业用途!如进行转载请务必注明出处!谢谢!

Flask-SQLAlchemy库

另外一个库,叫做Flask-SQLAlchemyFlask-SQLAlchemy是对SQLAlchemy进行了一个简单的封装,使得我们在flask中使用sqlalchemy更加的简单。可以通过pip install flask-sqlalchemy。使用Flask-SQLAlchemy的流程如下:

  1. 数据库初始化:数据库初始化不再是通过create_engine,请看以下示例:

    from flask import Flask from flask_sqlalchemy import SQLAlchemy from constants import DB_URI app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI db = SQLAlchemy(app)
  2. ORM类:之前都是通过Base = declarative_base()来初始化一个基类,然后再继承,在Flask-SQLAlchemy中更加简单了(代码依赖以上示例):

    class User(db.Model): id = db.Column(db.Integer,primary_key=True) username = db.Column(db.String(80),unique=True) email = db.Column(db.String(120),unique=True) def __init__(self,username,email): self.username = username self.email = email def __repr__(self): return '<User %s>' % self.username
  3. 映射模型到数据库表:使用Flask-SQLAlchemy所有的类都是继承自db.Model,并且所有的Column和数据类型也都成为db的一个属性。但是有个好处是不用写表名了,Flask-SQLAlchemy会自动将类名小写化,然后映射成表名。
    写完类模型后,要将模型映射到数据库的表中,使用以下代码创建所有的表:

    db.create_all()
  4. 添加数据:这时候就可以在数据库中看到已经生成了一个user表了。接下来添加数据到表中:

    admin = User('admin','admin@example.com') guest = User('guest','guest@example.com') db.session.add(admin) db.session.add(guest) db.session.commit()

    添加数据和之前的没有区别,只是session成为了一个db的属性。

  5. 查询数据:查询数据不再是之前的session.query了,而是将query属性放在了db.Model上,所以查询就是通过Model.query的方式进行查询了:

    users = User.query.all() # 再如: admin = User.query.filter_by(username='admin').first() # 或者: admin = User.query.filter(User.username='admin').first()
  6. 删除数据:删除数据跟添加数据类似,只不过sessiondb的一个属性而已:

    db.session.delete(admin) db.session.commit()

7265人已阅读,今天你学习了吗?

5条回复
  • dilen2022-10-12 03:34:49

    报这个:
    This typically means that you attempted to use functionality that needed

    the current application. To solve this, set up an application context

    with app.app_context(). See the documentation for more information.


  • 齐天大圣2022-10-31 09:26:25

    是的,遇到同样的问题。解决方法:需要在第一次创建表时使用 dp.drop_all()

    具体操作:

    @app.route('/article')

    def article_view():

        dp.drop_all()

        dp.create_all()

        ...


    或者:

    @app.route('/article')

    def article_view():

        with app.app_context():

            dp.drop_all()

            dp.create_all()

        ...


  • lambda丶雨辰2022-10-17 08:24:48

    To solve this, set up an application context

        with app.app_context().


  • lambda丶雨辰2022-10-17 08:10:14
    app.app_context():
        db.drop_all()
        db.create_all()


    在删除和创建表前加上此条件,具体原因尚不明确,有可能是由于python3.10更新了上下文管理器导致

  • dilen2022-10-12 01:36:17

    按讲义的来报错哦,

    Traceback (most recent call last):

      File "E:\mysite\py38\lib\site-packages\click\core.py", line 1055, in main

        rv = self.invoke(ctx)

      File "E:\mysite\py38\lib\site-packages\click\core.py", line 1657, in invoke

        return _process_result(sub_ctx.command.invoke(sub_ctx))

      File "E:\mysite\py38\lib\site-packages\click\core.py", line 1404, in invoke

        return ctx.invoke(self.callback, **ctx.params)

      File "E:\mysite\py38\lib\site-packages\click\core.py", line 760, in invoke

        return __callback(*args, **kwargs)

      File "E:\mysite\py38\lib\site-packages\click\decorators.py", line 84, in new_func

        return ctx.invoke(f, obj, *args, **kwargs)

      File "E:\mysite\py38\lib\site-packages\click\core.py", line 760, in invoke

        return __callback(*args, **kwargs)

      File "E:\mysite\py38\lib\site-packages\flask\cli.py", line 911, in run_command

        raise e from None

      File "E:\mysite\py38\lib\site-packages\flask\cli.py", line 897, in run_command

        app = info.load_app()

      File "E:\mysite\py38\lib\site-packages\flask\cli.py", line 308, in load_app

        app = locate_app(import_name, name)

      File "E:\mysite\py38\lib\site-packages\flask\cli.py", line 218, in locate_app

        __import__(module_name)

      File "E:\mysite\flaskProject\app.py", line 27, in <module>

        db.create_all()

      File "E:\mysite\py38\lib\site-packages\flask_sqlalchemy\extension.py", line 868, in create_all

        self._call_for_binds(bind_key, "create_all")

      File "E:\mysite\py38\lib\site-packages\flask_sqlalchemy\extension.py", line 839, in _call_for_binds

        engine = self.engines[key]

      File "E:\mysite\py38\lib\site-packages\flask_sqlalchemy\extension.py", line 628, in engines

        app = current_app._get_current_object()  # type: ignore[attr-defined]

      File "E:\mysite\py38\lib\site-packages\werkzeug\local.py", line 513, in _get_current_object

        raise RuntimeError(unbound_message) from None

    RuntimeError: Working outside of application context.


    This typically means that you attempted to use functionality that needed

    the current application. To solve this, set up an application context

    with app.app_context(). See the documentation for more information.

    python-BaseException


    Process finished with exit code -1073741510 (0xC000013A: interrupted by Ctrl+C)


添加新回复