Python中Flask教程里db.DateTime和db.DateTime()带不带括号有什么区别?

https://github.com/miguelgrinberg/flasky/blob/master/app/models.py

line 80:

timestamp = db.Column(db.DateTime, default=datetime.utcnow)

line 94 和 line 95:

member_since = db.Column(db.DateTime(), default=datetime.utcnow)

db.DateTime 后面带不带括号有什么区别吗?


Python中Flask教程里db.DateTime和db.DateTime()带不带括号有什么区别?

8 回复

看看 db.Column 的代码呢


在Flask-SQLAlchemy里,db.DateTimedb.DateTime()区别挺明显的。

db.DateTime是类本身,直接用它的话,SQLAlchemy会创建一个默认的DateTime类型列,不带任何额外参数。而db.DateTime()是创建了一个DateTime类型的实例,你可以在括号里传参数来定制列的行为。

看个具体例子:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALchemy_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    # 使用db.DateTime - 默认配置
    created_at1 = db.Column(db.DateTime)
    # 使用db.DateTime() - 可以传递参数
    created_at2 = db.Column(db.DateTime(timezone=True))
    updated_at = db.Column(db.DateTime(), nullable=False, default=db.func.now())

关键区别:

  1. 参数传递db.DateTime()能传参数,比如timezone=True开启时区支持
  2. 默认值:两种方式都能在db.Column()里设置defaultnullable等约束
  3. 实际效果:大多数简单场景下,两者效果一样,因为db.DateTime在SQLAlchemy内部会被自动实例化

我平时写的时候,如果不需要额外参数就直接用db.DateTime,需要配置参数时用db.DateTime(),这样代码更清晰。

简单说:需要配置参数就用括号,不需要就不用。

<pre>
def f():
return 1

print f
print f()
</pre>
个人理解,一个是函数指针,一个是函数调用,传递的是调用的结果值。python 新手,如理解有误欢迎指正交流。

这两个在这里这样用没有区别,都可以。
但是,注意后面的

flask 教程质量良莠不齐。sqlalchemy 更是深坑

但是,注意后面的 default=datetime.utcnow,这里要传函数。如果用的是 default=datetime.utcnow(),就传了函数执行的结果,是一个固定值(应用跑起来的时间)。




后面的那个坑踩过一回了,所以不确定前面这个是不是也有坑

用来对应数据库里字段类型的 原则上传 class 才是对的

能传带括号应该是内部做了兼容

回到顶部