赞
踩
- Flask没有指定使用的数据库,不像django提供了orm数据库抽象层,可以直接采用对象的方式操作数据库。但为了开发效率,在开发Flask项目中一般会选择 SQLALchemy 来操作数据库,类似django的ORM.
- SQLALchemy实际是对数据库的抽象,让开发者不直接使用sql语句进行开发,而是通过Python对象来操作数据库。
以下所有的操作都在PyCharm中进行
pip install flask
pip install Flask-SQLAlchemy
== flask连接sqlite数据库(以下可能会报错,请注意注释!)==
from flask import Flask from flask_sqlalchemy import SQLAlchemy import os app = Flask(__name__) # 【1】注释以下两行后可能会报错: RuntimeError: Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set. # app_ctx = app.app_context() # app_ctx.push() class BaseConfig(): DEBUG = True # 获取项目目录 APP_PATH = os.path.dirname(__file__) # sqlite数据库url SQLALCHEMY_DATABASE_URI = f'sqlite:///{APP_PATH}/database' app.config.from_object(BaseConfig) # 创建数据库连接,管理项目 db = SQLAlchemy(app) class User(db.Model): #模型类继承db.Model """创建User表""" # SQLAlchemy 需要手动执行主键列,第一个参数是 字段类型,第二个参数是约束条件 id = db.Column(db.INTEGER, primary_key=True) username = db.Column(db.String(50)) password = db.Column(db.String(40)) # 【2】若想增加一个字段,run之后并没有加入表中,可以先删除表,再run,然后刷新即可加入(因为该表已存在,不会重新创建表了) # desc = db.Column(db.String(40)) if __name__ == '__main__': # 【3】删除所有表,注意这条是危险命令,会将模型类对应数据库中的表物理删除。在实际生产环境下勿用。 # db.drop_all() db.create_all() # 创建所有的表
直接运行以上代码,会发现报错“RuntimeError: Working outside of application context.”(下图),需要撤销注释【1】
解决:请看大神操作
URI: 统一资源标识符,用于标识某一互联网资源名称的字符串
数据库 | URI |
---|---|
MySQL | mysql://username:password@hostname/database |
Postgres | postgresql://username:password@hostname/database |
SQLite (Unix) | sqlite:python/data/database |
SQLite (Windows) | sqlite:///c:/db/data/database |
Oracle | oracle://scott:tiger@127.0.0.1:1521/sidname |
字段说明:
username: 登录数据库的用户名
password: 登录数据库的密码
hostname:服务器主机ip,可以是本地主机(localhost)也可以是远程服务器
database:表示要使用的数据库
在ubuntu中连接mysql要先创建数据库:
先在mysql中创建数据库:# 连接mysql mysql -uroot -pmysql # 查看所有数据库 show databases; # 创建数据库名为 py create database py charset=utf8;
- 1
- 2
- 3
- 4
- 5
- 6
pip install pymysql # 首先保证安装有mysql应用程序
from flask import Flask from flask_sqlalchemy import SQLAlchemy import os import pymysql pymysql.install_as_MySQLdb() app = Flask(__name__) # 不加以下两行可能会报错 RuntimeError: Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set. app_ctx = app.app_context() app_ctx.push() class BaseConfig(): DEBUG = True # 获取项目目录 APP_PATH = os.path.dirname(__file__) # sqlite数据库url # SQLALCHEMY_DATABASE_URI = f'sqlite:///{APP_PATH}/database' # mysql数据库url SQLALCHEMY_DATABASE_URI = 'mysql://username:password@hostname/database' # 填写自己mysql数据库的用户名,密码,主机IP端口,数据库名 例如:hostname:127.0.0.1:3306 app.config.from_object(BaseConfig) # 创建数据库连接,管理项目 db = SQLAlchemy(app) class User(db.Model): #模型类继承db.Model id = db.Column(db.INTEGER, primary_key=True) username = db.Column(db.String(50)) password = db.Column(db.String(40)) # desc = db.Column(db.String(40)) # 增加一个字段 run后没有加入表中,要先删除表,再run,然后刷新表 if __name__ == '__main__': # 删除所有表 # db.drop_all() db.create_all() # 创建所有的表
- 测试连接时,如果出现了如下报错:Server returns invalid timezone. Need to set ‘serverTimezone’ property.
- 原因:时区不一致,MySQL驱动中默认时区是UTC,与本地时间(中国)相差8个小时。
GMT(Greenwich Mean Time):格林威治标准时间
UTC:世界标准时间
CST(China Standard Time):中国标准时间
GMT + 8 = UTC + 8 = CST
- 方法:
点击Set time zone,在UTC后+8(或者改为GMT)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。