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', 'johndoe@email.com', '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="johndoe@email.com",
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="johndoe@email.com",
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')
此问题是由使用 Windows 附带的古老“SQL Server”ODBC 驱动程序 (SQLSRV32.DLL) 引起的。
通过安装“ODBC Driver 18 for SQL Server”并使用它解决了这个问题。