尝试使用SQLAlchemy导入和创建数据库时收到“ TypeError”

时间:2019-12-20 20:43:20

标签: python flask orm sqlalchemy

我已经开始一个项目的工作,并已决定要深入研究ORM(这意味着要重新编写我的类)。我相信我的代码是正确的,但是每当尝试使用Python创建数据库架构时,都会收到“ TypeError”。我在项目目录中加载了Python控制台,然后键入“ from app import db”,效果很好。在命令“ 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格式:需要数字,而不是'

我不知道原因在我的实际代码中可能在什么地方,并且全死了。

任何帮助都将是非常有用的-在我添加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

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

非常感谢

1 个答案:

答案 0 :(得分:0)

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