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()带不带括号有什么区别?
看看 db.Column 的代码呢
在Flask-SQLAlchemy里,db.DateTime和db.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())
关键区别:
- 参数传递:
db.DateTime()能传参数,比如timezone=True开启时区支持 - 默认值:两种方式都能在
db.Column()里设置default、nullable等约束 - 实际效果:大多数简单场景下,两者效果一样,因为
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 才是对的
能传带括号应该是内部做了兼容

