当前位置: 首页 > 科技观察

谈谈Flask使用SQLite数据库,你会吗?

时间:2023-03-19 22:28:06 科技观察

SQLite是一款小巧轻量级的数据库,特别适合个人学习。因为SQLite不需要额外的数据库服务器,所以它也被嵌入到Python中。缺点是如果有大量的写请求,是串行处理的,速度很慢。连接数据库并创建一个新的flaskr/db.py文件:PARSE_DECLTYPES)g.db.row_factory=sqlite3.Rowreturng.dbdefclose_db(e=None):db=g.pop('db',None)ifdbisnotNone:db.close()g是flask为每个请求创建的独立对象存储全局数据。当通过g为同一个请求多次调用get_db时,不会创建新的连接,而是会重用已建立的连接。flask应用程序创建后处理数据库连接时会调用get_db。sqlite3.connect()用于建立数据库连接,指定配置文件的KeyDATABASE。sqlite3.Row允许数据库将行作为字典返回,这样就可以通过列名检索值。close_db关闭数据库连接,它首先检查是否设置了g.db,如果设置了则关闭db。创建表新建flaskr/schema.sql文件:DROPTABLEIFEXISTSuser;DROPTABLEIFEXISTSpost;CREATETABLEuser(idINTEGERPRIMARYKEYAUTOINCREMENT,usernameTEXTUNIQUENOTNULL,passwordTEXTNOTNULL);CREATETABLEpost(idINTEGERPRIMARYKEYAUTOINCREMENT,author_idINTEGERNOTNULL,createdTIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP,titleTEXTNOTNULL,bodyTEXTNOTNULL,FOREIGNKEY(author_id)REFERENCESuser(id));在flaskr/db.在py文件中添加如下代码:definit_db():db=get_db()withcurrent_app.open_resource('schema.sql')asf:db.executescript(f.read().decode('utf8'))@click。command('init-db')@with_appcontextdefinit_db_command():"""Cleartheexistingdataandcreatenewtables."""init_db()click.echo('Initializedthedatabase.')open_resource()打开刚刚创建的数据库脚本文件。@click.command()定义了命令行命令init-db。注册到应用Flask的close_db和init_db_command函数不会自动触发,需要手动注册到应用。编辑flaskr/db.py文件:definit_app(app):app.teardown_appcontext(close_db)app.cli.add_command(init_db_command)app.teardown_appcontext指定响应结束后清理的函数。app.cli.add_command定义了flask命令可以使用的命令。然后在创建应用函数中手动添加init_app,编辑flaskr/__init__.py文件:defcreate_app():app=...#existingcodeomittedfrom.importdbdb.init_app(app)returnapp执行命令至此,准备工作就绪,打开命令行执行:$flaskinit-dbInitializedthedatabase。在项目目录下,会生成一个flaskr.sqlite,就是SQLite数据库。参考资料:https://flask.palletsprojects.com/en/2.0.x/tutorial/database/