FLASK——flask_sqlalchemy db.DateTime 字段保存毫秒/微秒(.000000)

问题描述:

数据库中时间字段未保存微秒部分。

from app import db
from datetime import datetime


class User(db.Model):
    __tablename__ = 'user'
    userId = db.Column(db.BIGINT, primary_key=True, autoincrement=True, nullable=False)
    userName = db.Column(db.String(16), nullable=False, unique=True)
    passwordHash = db.Column(db.String(16), nullable=False)
    createTime = db.Column(db.DateTime, default=datetime.now, nullable=False)     

nowTime = datetime.now()           # datetime.datetime(2018, 11, 2, 19, 1, 19, 903477)
print nowTime                                             # 2018-11-02 19:03:11.471624
print datetime.strftime(nowTime, '%Y-%m-%d %H:%M:%S.%f')  # 2018-11-02 19:03:11.471624

user = User(
    userName='reidlv',
    passwordHash='this_is_a_passwordHash_string'
    createTime=nowTime
)
db.session.add(user)
db.session.commit()

user_ = User.query.filter_by(userName='reidlv').first()
print user_.createTime.strptime('%Y-%m-%d %H:%M:%S.%f')          # 2018-11-02 19:03:11

解决方法:

db.DateTime 修改为 DATETIME(fsp=6)

from app import db
from datetime import datetime
from sqlalchemy.dialects.mysql import DATETIME


class User(db.Model):
    __tablename__ = 'user'
    userId = db.Column(db.BIGINT, primary_key=True, autoincrement=True, nullable=False)
    userName = db.Column(db.String(16), nullable=False, unique=True)
    passwordHash = db.Column(db.String(16), nullable=False)
    createTime = db.Column(DATETIME(fsp=6), default=datetime.now, nullable=False)

以上,问题解决。

<think> 我们正在使用Flask框架,并且希望将SQLite数据库文件固定存储在Flask应用下的instance/app.db,无论从哪个路径运行Python脚本。 在Flask中,通常使用`app.instance_path`来获取instance目录的路径。instance目录是Flask应用用于存放私有数据(如数据库文件)的目录,它独立于应用代码,通常位于项目根目录下的instance文件夹。 根据Flask文档,`app.instance_path`是Flask应用实例的一个属性,它指向实例文件夹的路径。我们可以利用这个属性来构建数据库文件的绝对路径。 假设我们使用Flask-SQLAlchemy扩展,通常我们会在配置数据库URI时指定路径。如果没有使用Flask-SQLAlchemy,而是直接使用sqlite3,同样可以通过构建绝对路径来实现。 以下是两种情况的修改方法: 情况一:使用Flask-SQLAlchemy 在创建Flask应用实例后,我们可以这样配置SQLALCHEMY_DATABASE_URI: app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(app.instance_path, 'app.db') 情况二:直接使用sqlite3 在连接数据库时,使用: import sqlite3 conn = sqlite3.connect(os.path.join(app.instance_path, 'app.db')) 但是,通常我们会在应用工厂函数中创建应用实例,然后配置数据库。下面是一个示例: 步骤1:确保导入了os模块。 步骤2:在创建应用实例后,设置数据库URI。 示例代码: from flask import Flask import os app = Flask(__name__) # 配置数据库URI app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(app.instance_path, 'app.db') 注意:如果使用Flask-SQLAlchemy,需要先初始化db对象,并且确保在应用上下文中使用。 另外,引用[2]中提到,在flaskr的instance文件夹下生成一个flaskr.sqlite文件,说明Flask项目通常将数据库文件放在instance目录下。 因此,修改配置为使用app.instance_path可以确保无论从哪个路径运行应用,数据库文件都位于Flask应用的instance目录下。 下面是一个完整的应用工厂函数示例(使用Flask-SQLAlchemy): from flask import Flask from flask_sqlalchemy import SQLAlchemy import os db = SQLAlchemy() def create_app(): app = Flask(__name__) # 配置数据库URI,使用instance_path app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(app.instance_path, 'app.db') # 其他配置... db.init_app(app) return app 这样,无论从哪里运行应用,数据库文件都会在instance/app.db。 注意:确保instance目录存在。Flask不会自动创建instance目录,但是当尝试写入文件时,如果目录不存在,可能会引发错误。因此,在初始化数据库之前,可以检查并创建instance目录。 我们可以添加一个函数来确保instance目录存在: if not os.path.exists(app.instance_path): os.makedirs(app.instance_path) 通常在创建应用实例后,运行应用之前执行这个检查。 另外,如果使用Flask命令行来初始化数据库(如引用[2]中的`flask init-db`),也需要确保在初始化数据库之前instance目录存在。 总结修改步骤: 1. 修改数据库配置,使用`os.path.join(app.instance_path, 'app.db')`构建数据库文件路径。 2. 确保应用启动时instance目录存在(可以在应用工厂函数中创建)。 这样修改后,数据库路径就与Python运行路径无关了。 </think> 根据您的需求,我将逐步指导如何修改Flask应用的SQLite数据库路径配置,使其始终绑定到`instance/app.db`,不受Python运行路径影响。核心解决方案是利用Flask的**应用上下文**和**实例文件夹**(instance folder)特性[^1][^4]。 ### 解决方案步骤 #### 1. 配置数据库URI使用实例路径 在Flask应用配置中,使用`app.instance_path`获取实例文件夹绝对路径,动态构建数据库URI: ```python from flask import Flask import os app = Flask(__name__) # 配置数据库路径为instance/app.db app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///{os.path.join(app.instance_path, 'app.db')}" ``` #### 2. 确保实例文件夹存在 添加初始化逻辑,在应用启动时自动创建实例文件夹: ```python # 确保实例文件夹存在 if not os.path.exists(app.instance_path): os.makedirs(app.instance_path) print(f"创建实例文件夹: {app.instance_path}") ``` #### 3. 完整示例代码 ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy import os # 初始化应用 app = Flask(__name__) # 配置实例路径数据库 app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///{os.path.join(app.instance_path, 'app.db')}" app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 创建实例文件夹 if not os.path.exists(app.instance_path): os.makedirs(app.instance_path) # 初始化数据库扩展 db = SQLAlchemy(app) # 定义示例模型 class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True) # 创建数据库表 @app.cli.command("init-db") def init_db(): db.create_all() print(f"数据库已创建于: {app.config['SQLALCHEMY_DATABASE_URI']}") if __name__ == "__main__": app.run(debug=True) ``` ### 关键原理说明 1. **实例文件夹特性**: - Flask的`app.instance_path`始终指向应用专属的实例文件夹 - 默认路径为项目根目录下的`instance`文件夹 - 路径解析独立于Python运行路径[^1][^4] 2. **路径构建优势**: ```python f"sqlite:///{os.path.join(app.instance_path, 'app.db')}" ``` - 使用`os.path.join`确保跨平台兼容性 - 动态构建绝对路径避免相对路径问题 - 数据库文件位置:`your_project/instance/app.db` 3. **部署一致性**: - 开发/生产环境路径一致 - 支持不同运行方式: ```bash # 任意位置运行 python /path/to/app.py flask run --app /path/to/app.py ``` ### 验证方法 1. 初始化数据库: ```bash flask init-db ``` 2. 检查输出: ``` 数据库已创建于: sqlite:////absolute/path/to/project/instance/app.db ``` 3. 确认文件位置: ```bash ls project/instance/ # 应显示 app.db ``` 此方案确保数据库路径始终绑定到应用实例文件夹,解决了路径相关性问题,符合Flask最佳实践[^2][^5]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值