首页 > 解决方案 > 尝试使用 SQLAlchemy 导入和创建数据库时收到“TypeError”

问题描述

我已经开始了一个项目,并在我太深而无法整理我的 ORM 之前做出决定(这意味着要重新编写我的类)。我相信我的代码是正确的,但是每当我尝试使用 Python 创建数据库模式时,都会收到“TypeError”。我在我的项目目录中加载 Python 控制台,然后输入“从应用程序导入数据库”,它工作正常。在命令“db.create_all()”(使用基本示例工作)之后,我被抛出错误:

'文件 "C:\Users\owner\AppData\Local\Programs\Python\Python38-32\lib\site-packages\sqlalchemy\dialects\mysql\base.py",第 2016 行,在 visit_VARCHAR 返回 self._extend_string(type_ , {}, "VARCHAR(%d)" % type_.length) TypeError: %d format: a number is required, not type'

我不知道原因可能在我的实际代码中的什么位置,并且完全不知所措。

任何帮助都会很棒 - 很多代码都被注释掉了,还有一些其他代码暂时保留,因为我正在添加我的 ORM,但它最初是在没有 SQLAlchemy 的情况下实现的。下面是我的“ init .py”代码:

from flask import Flask, render_template, url_for, flash, redirect, g, request, session, send_from_directory, send_file
from heychef.config import Config
from flask_sqlalchemy import SQLAlchemy
import os
import bcrypt
import uuid
import json
import ssl
from datetime import datetime
from datetime import timedelta
from heychef.models.Agency import Agency
from heychef.models.User import User
from heychef.models.Shift import Shift
from flaskext.mysql import MySQL


app = Flask(__name__)
app.config.from_object(Config)

db = SQLAlchemy(app)

from heychef.models.Agent import Agent

@app.before_request
def before_request():
    g.agent = None
    g.agency = None
    if 'agent' in session:
        g.agent = session['agent']
    if 'agency' in session:
        g.agency = session['agency']

##########################################################
#############         Agent Routes        ################
##########################################################

@app.route("/")
def home():
    return render_template('agent-views/signup.html'), 200

@app.route("/agent-signup", methods = ['POST', 'GET'])
def agentSignup():
    if request.method == 'POST':    
        email = request.form['inputEmail']
        firstName = request.form['inputFirstName']
        secondName = request.form['inputSecondName']
        password = request.form['inputPassword']
        rPassword = request.form['inputConfirmPassword']     
        if(password != rPassword):
            flash('Passwords do not match.', 'danger')
            return render_template('agent-views/signup.html')
        else:
            hashedPwd = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
            agent = Agent(firstName, secondName, email, hashedPwd)
            agent.addAgent(self)
            flash('Account created, you can log in now.', 'success')
            return render_template('agent-views/signup.html')

@app.route("/agent-login", methods = ['POST','GET'])
def agentLogin():
    if request.method == 'POST':
        session.pop('agent', None)
        email = request.form['inputEmail']
        pwd = request.form['inputPassword']
        connection = mysql.get_db()
        cursor = connection.cursor()
        result, msg = Agent.agentLogin(connection, cursor, email, pwd)
        if(result):
            session['agent'] = email
            flash(msg, 'success')
            return redirect(url_for('agentDashboard'))
        else:       
            flash(msg, 'danger')
            return render_template('agent-views/login.html')
    else:
        return render_template('agent-views/login.html')

@app.route("/agent-dashboard", methods = ['GET'])
def agentDashboard():
    if g.agent:
        return render_template('agent-views/dashboard.html'), 200
    else:
        msg = "Please log in"
        flash(msg, 'warning')
        return redirect(url_for('agentLogin'))

if __name__ == "__main__":
    app.run()

这是我的代理类:

from heychef.models.User import User
#from heychef.models.data.AgentDb import AgentDb
from heychef import db

class Agent(db.Model):
    agentId = db.Column(db.Integer, unique=True, nullable=False, primary_key=True)
    firstName = db.Column(db.String(80), unique=False, nullable=False, primary_key=False)
    secondName = db.Column(db.String(80), unique=False, nullable=False, primary_key=False)
    email = db.Column(db.String(80), unique=False, nullable=False, primary_key=False)
    level = db.Column(db.String(80), unique=False, nullable=True, primary_key=False)
    agencyId = db.Column(db.Integer, unique=False, nullable=True, primary_key=False)
    addressLine1 = db.Column(db.String(80), unique=False, nullable=True, primary_key=False)
    addressLine2 = db.Column(db.String(80), unique=False, nullable=True, primary_key=False)
    addressLine3 = db.Column(db.String(80), unique=False, nullable=True, primary_key=False)
    postcode = db.Column(db.String(20), unique=False, nullable=True, primary_key=False)
    passwordHash = db.Column(db.String(256), unique=False, nullable=False, primary_key=False)

    def __repr__(self):
        return "<Agent(firstName='%s', lastName='%s')>" % (self.firstName, self.lastName)

    def __init__(self, firstName, secondName, email, hashedPwd):
        self.agentId = 1001
        self.firstName = firstName
        self.secondName = secondName
        self.email = email
        self.passwordHash = hashedPwd


    @staticmethod
    def agentEmailExists(cursor, email):
        exists = AgentDb.agentEmailExistsDb(cursor, email)
        return exists

    @staticmethod
    def addAgent(agent):
        db.session.add(self)
        db.session.commit()

    @staticmethod
    def agentLogin(connection, cursor, email, pwd):
        failMsg = 'Email or Password does not match.' 
        successMsg = 'Successfully logged in.'
        result = AgentDb.agentLoginDb(connection, cursor, email, pwd)
        if(result):
            msg = successMsg
        else:
            msg = failMsg
        return result, msg

    @staticmethod
    def getWork(cursor):
        work = AgentDb.getWorkDb(cursor)
        return work

任何帮助都是王牌,因为我真的很挣扎!

非常感谢

标签: pythonflaskormsqlalchemy

解决方案


该错误似乎与 VARCHAR (String)db 列有关,并指出它已收到非整数值,因此db.string()在您的项目中的其他模型类中可能存在带有非整数或空括号的模型字段.


推荐阅读