pyodbc 和 SQL Server 出现“无效精度值 (0)”错误

问题描述 投票:0回答:1

SQLAlchemy 版本:2.0.1
Flask-SQLAlchemy 版本:3.0.3

我正在尝试使用 Flask_alchemy 包从我的 Python Flask Web 应用程序将联系表单插入到我的 SQL Server 数据库中,但出现以下错误:

sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('HY104', '[HY104] [Microsoft][ODBC SQL Server Driver]Invalid precision value (0) (SQLBindParameter)')
[SQL: INSERT INTO [ContactForms] (first_name, last_name, email, phone, msg) OUTPUT inserted.id VALUES (?, ?, ?, ?, ?)]
[parameters: ('John', 'Doe', '[email protected]', '555-555-5555', "Hello, I'd like to inquire about your services.")]
(Background on this error at: https://sqlalche.me/e/20/dbapi)

我的模特:

class ContactFormsTable(db.Model):
    __tablename__ = "ContactForms"
    id = db.Column("id", db.Integer, primary_key=True)
    first_name = db.Column (db.VARCHAR(25), nullable=False)
    last_name = db.Column (db.VARCHAR(25), nullable=False)
    email = db.Column (db.VARCHAR(75), nullable=False)
    phone = db.Column (db.CHAR(12), default=None, nullable=True)
    msg = db.Column (db.TEXT, nullable=False)

我的插入声明:

new_contact_form = ContactFormsTable(
            first_name="John",
            last_name="Doe",
            email="[email protected]",
            phone="555-555-5555",
            msg="Hello, I'd like to inquire about your services."
        )
        db.session.add(new_contact_form)
        db.session.commit()

SQL Server 表架构:

架构与显示的一样,其中

id
列为主键。

我最初在 SQL Server 表中设置了自动增量,但尝试将其关闭,但仍然不起作用。我认为这与

id
列有关,但不确定

我尝试将

phone
列更改为
varchar(15)
但仍然遇到相同的错误

使用香草

sqlalchemy
的连接字符串一切正常,但在这里切换到
flask_sqlalchemy
并使用
db.model
而不是
sqlalchemy.Table

我的

__init__.py

from flask import Flask
from .extensions import db
from .routes.routes import pages
from .routes.api import api
import os
import pyodbc

def create_app():
    app = Flask(__name__)
    app.config["SQLALCHEMY_DATABASE_URI"] = f'mssql+pyodbc://@{SERVER_NAME}/{DEV_DB}?driver={ODBC_18_DRIVER}&UID=USERNAME&PWD=PASSWORD' 
    db.init_app(app)
    app.register_blueprint(pages)
    app.register_blueprint(api)
    app.secret_key = SECRET_KEY
    return app

app = create_app()

extensions.py

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

我的主要路线:

from flask import Blueprint, render_template
from ..extensions import db

pages = Blueprint("pages", __name__, template_folder="templates", static_folder="static")

@pages.route('/')
def home():
    new_contact_form = ContactFormsTable(
            first_name="John",
            last_name="Doe",
            email="[email protected]",
            phone="555-555-5555",
            msg="Hello, I would like to inquire about your services."
        )

    db.session.add(new_contact_form)
    db.session.commit()
    return render_template('home.html')
python sqlalchemy flask-sqlalchemy pyodbc
1个回答
1
投票

此问题是由使用 Windows 附带的古老“SQL Server”ODBC 驱动程序 (SQLSRV32.DLL) 引起的。

通过安装“ODBC Driver 18 for SQL Server”并使用它解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.