【问题标题】:(builtins.TypeError) SQLite Date type only accepts Python date objects as input(builtins.TypeError) SQLite 日期类型只接受 Python 日期对象作为输入
【发布时间】:2020-05-09 09:43:47
【问题描述】:

我尝试了多种在我的 SQLAlchemy 对象中插入日期的方法。但是会报错。

我的路线文件:

app.route('/signup', methods=['POST'])
def signup():
    reply = {}
    try:
        data = request.get_json()
        password_hash = generate_password_hash(data['password'])
        datelist = data['birthdate'].split('-')
        bdate = datetime.date(int(datelist[0]), int(datelist[1]), int(datelist[2]))
        new_user = Entities.User(id = uuid.uuid4(), username = data['username'], fullname = data['fullname'], email = data['email'], password_hash = password_hash, birthdate = bdate)
        db.session.add(new_user)
        db.session.commit()
        reply['status'] = "OK"
        reply['message'] = ""
    except Exception as e:
        reply['status'] = "FAIL"
        reply['message'] = str(e)
    return jsonify(reply)

我的 SQLAlchemy 用户类:

class User(db.Model):
    id = db.Column(db.String(40), unique=True, primary_key=True)
    username = db.Column(db.String(25), index=True, unique=True)
    fullname = db.Column(db.String(25), index=True)
    email = db.Column(db.String(25), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    imagelink = db.Column(db.String(300), default = "some.url.unspecified.com")
    bio = db.Column(db.String(700), default = "No Bio Added")
    datejoined = db.Column(db.Date, default = date.today().strftime("%Y-%m-%d"))
    birthdate = db.Column(db.String(10))

我的查询的 JSON 正文: 我将其发射到本地主机。 http://127.0.0.1:5001/signup

{
    "username":"amandesai01",
    "fullname":"Aman Desai",
    "password":"xyz123",
    "email":"amandesai01@gmail.com",
    "birthdate":"2000-10-14"
}

我得到的回应:

{
  "message": "(builtins.TypeError) SQLite Date type only accepts Python date objects as input.\n[SQL: INSERT INTO user (id, username, fullname, email, password_hash, imagelink, bio, datejoined, birthdate) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)]\n[parameters: [{'password_hash': 'pbkdf2:sha256:150000$CPZYKMPJ$b4e0f3a01e17e533a92cd21709b1e4f496f068bd19c8b31fa2723cbbf1ea6beb', 'id': UUID('0e8f6414-27af-4ca9-8e72-a0f4974a0b0d'), 'fullname': 'Aman Desai', 'birthdate': datetime.date(2000, 10, 14), 'email': 'amandesai01@gmail.com', 'username': 'amandesai01'}]]",
  "status": "FAIL"
}

【问题讨论】:

  • 我不明白他们到底需要哪个日期对象。我试过 datetime.date 但没有用 :(
  • datejoined = db.Column(db.Date, default = date.today().strftime("%Y-%m-%d")) 有一个有趣的默认值。

标签: python json sqlalchemy try-catch


【解决方案1】:

错误说明了问题。试试这个

  1. 首先您需要导入datetime 类。
from datetime import datetime, date
  1. 现在将此更改应用到您的 "birthdate" 列。
{
    "username":"amandesai01",
    "fullname":"Aman Desai",
    "password":"xyz123",
    "email":"amandesai01@gmail.com",
    "birthdate": datetime.date(2000-10-14)
}
  1. 要获取当前日期(今天的日期),请使用此命令
datejoined = db.Column(db.Date, default = date.today())

【讨论】:

  • 除非应用程序每天都重新启动,否则default = datetime.date.today() 是一个不好的默认选择。默认应该是date.today 函数本身。通过查看问题和响应,很明显他们已经在将生日作为值传递之前对其进行了转换,并且问题可能与datejoined 的字符串默认值有关。 datetime.date(2000-10-14) 是有效的 Python,但会引发异常,因为传递 1 个整数参数 1976 不是调用 date() 的方式。
  • 当我编辑我的答案时,我犯了一些错误。我已经编辑了它
  • @Kalana 你还没有解决 Ilja 提出的问题。
猜你喜欢
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
相关资源
最近更新 更多