pallets-eco / flask-admin

Simple and extensible administrative interface framework for Flask
https://flask-admin.readthedocs.io
BSD 3-Clause "New" or "Revised" License
5.69k stars 1.56k forks source link

Invalid precision value error #2360

Open HikariPL opened 1 year ago

HikariPL commented 1 year ago

Hello,

I have been using flask_admin for approx. 2 years in my flask app, but recently (after updating all packages) it stopped working. I can open front page of flask admin panel, but whenever I try to display content of a table then I get the following error:

DBAPIError
sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('HY104', '[HY104] [Microsoft][ODBC SQL Server Driver]Invalid precision value (0) (SQLBindParameter)')
[SQL: SELECT count(?) AS count_1 
FROM setup.users]
[parameters: ('*',)]
(Background on this error at: https://sqlalche.me/e/20/dbapi)

Traceback (most recent call last)
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1963, in _exec_single_context
self.dialect.do_execute(
^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\engine\default.py", line 920, in do_execute
cursor.execute(statement, parameters)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The above exception was the direct cause of the following exception:
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\flask\app.py", line 2213, in __call__
return self.wsgi_app(environ, start_response)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\flask\app.py", line 2193, in wsgi_app
response = self.handle_exception(e)
           ^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\flask\app.py", line 2190, in wsgi_app
response = self.full_dispatch_request()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\flask\app.py", line 1486, in full_dispatch_request
rv = self.handle_user_exception(e)
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\flask\app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
     ^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\flask\app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\flask_admin\base.py", line 69, in inner
return self._run_view(f, *args, **kwargs)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\flask_admin\base.py", line 369, in _run_view
return fn(self, *args, **kwargs)
       ^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\flask_admin\model\base.py", line 1980, in index_view
count, data = self.get_list(view_args.page, sort_column, view_args.sort_desc,
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\flask_admin\contrib\sqla\view.py", line 1086, in get_list
count = count_query.scalar() if count_query else None
        ^^^^^^^^^^^^^^^^^^^^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\orm\query.py", line 2820, in scalar
ret = self.one()
      ^^^^^^^^^^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\orm\query.py", line 2793, in one
return self._iter().one()  # type: ignore
       ^^^^^^^^^^^^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\orm\query.py", line 2842, in _iter
result: Union[ScalarResult[_T], Result[_T]] = self.session.execute(

File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2231, in execute
return self._execute_internal(

File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2126, in _execute_internal
result: Result[Any] = compile_state_cls.orm_execute_statement(

File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\orm\context.py", line 292, in orm_execute_statement
result = conn.execute(

File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1413, in execute
return meth(

File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\sql\elements.py", line 483, in _execute_on_connection
return connection._execute_clauseelement(

File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1637, in _execute_clauseelement
ret = self._execute_context(

File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1841, in _execute_context
return self._exec_single_context(

File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1982, in _exec_single_context
self._handle_dbapi_exception(
^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 2339, in _handle_dbapi_exception
raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1963, in _exec_single_context
self.dialect.do_execute(
^
File "C:\Users\lzochowski001\Documents\FinanceManagementApp\Test with new packages\venv\Lib\site-packages\sqlalchemy\engine\default.py", line 920, in do_execute
cursor.execute(statement, parameters)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('HY104', '[HY104] [Microsoft][ODBC SQL Server Driver]Invalid precision value (0) (SQLBindParameter)')
[SQL: SELECT count(?) AS count_1
FROM setup.users]
[parameters: ('*',)]
(Background on this error at: https://sqlalche.me/e/20/dbapi)

I am connecting to SQL Server via pyodbc. I think it must be linked with this issue GitHub.

Possibly explicit input size is needed when admin creates engine: e = create_engine("mssql+pyodbc://...", use_setinputsizes=False)

Any ideas how to easily solve it?

HikariPL commented 1 year ago

Dear All, any ideas how to fix it?

agxc commented 9 months ago

No the issue cannot be resolved by use_setinputsizes=False. It is not working. I tried the following code. Not working at all

import argparse
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
from sqlalchemy import create_engine

app = Flask(__name__)

# Setup the Flask app
app.config['SECRET_KEY'] = 'mysecret'
app.config['SQLALCHEMY_DATABASE_URI'] = "YOUR SQL SERVER DB connection"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

# Optionally, if you want to perform some operations directly with the engine, you can create it like this:
engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'], echo=True, use_setinputsizes=False)

class User(db.Model):
    __tablename__ = 'user'
    __table_args__ = {'schema': 'DevApp'}

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(150), unique=True)
    email = db.Column(db.String(150))

admin = Admin(app, name='My App Admin', template_mode='bootstrap3')
admin.add_view(ModelView(User, db.session))

def create_db():
    """Creates the database tables."""
    with app.app_context():
        db.create_all()
        print('Database tables created successfully.')

def drop_db():
    """Drops the database tables."""
    with app.app_context():
        db.drop_all()
        print('Database tables dropped successfully.')

def run_app():
    app.run(debug=True)

def main():
    parser = argparse.ArgumentParser(description="Manage the Flask application.")
    parser.add_argument('command', choices=['run', 'create_db', 'drop_db'],
                        help='the command to run')
    args = parser.parse_args()

    if args.command == 'run':
        run_app()
    elif args.command == 'create_db':
        create_db()
    elif args.command == 'drop_db':
        drop_db()

if __name__ == '__main__':
    main()