{"id":23533,"library":"denodo-sqlalchemy","title":"Denodo SQLAlchemy Dialect","description":"A SQLAlchemy dialect for Denodo, enabling SQLAlchemy ORM and Core to connect to Denodo Virtual DataPort. Current version 2.0.5, requires Python >=3.9 and SQLAlchemy >=2.0. Released as needed, with breaking changes in the major version bump from 1.x to 2.x due to SQLAlchemy 2.0 compatibility.","status":"active","version":"2.0.5","language":"python","source_language":"en","source_url":"https://github.com/denodo/denodo-sqlalchemy","tags":["denodo","sqlalchemy","dialect","database","jdbc"],"install":[{"cmd":"pip install denodo-sqlalchemy","lang":"bash","label":"Install from PyPI"}],"dependencies":[{"reason":"Required: SQLAlchemy dialect interface","package":"sqlalchemy","optional":false},{"reason":"Required: JDBC bridge for Denodo","package":"jaydebeapi","optional":false},{"reason":"Required: Java bridge (used by jaydebeapi)","package":"jpype1","optional":false}],"imports":[{"note":"create_engine is from SQLAlchemy, not the dialect package","wrong":"from denodo_sqlalchemy import create_engine","symbol":"create_engine","correct":"from sqlalchemy import create_engine"},{"note":"Correct import for the dialect class","wrong":"","symbol":"DenodoDialect","correct":"from denodo_sqlalchemy import DenodoDialect"}],"quickstart":{"code":"from sqlalchemy import create_engine, text\nimport os\n\nuser = os.environ.get('DENODO_USER', '')\npassword = os.environ.get('DENODO_PASSWORD', '')\nhost = os.environ.get('DENODO_HOST', 'localhost')\ndatabase = os.environ.get('DENODO_DATABASE', 'test')\n\nengine = create_engine(f'denodo://{user}:{password}@{host}:9999/{database}')\n\nwith engine.connect() as conn:\n    result = conn.execute(text(\"SELECT 1\"))\n    print(result.fetchone())","lang":"python","description":"Connect to Denodo using SQLAlchemy engine."},"warnings":[{"fix":"Upgrade SQLAlchemy to >=2.0 and adjust code for SQLAlchemy 2.0 patterns (e.g., removed convert_unicode, future=True).","message":"denodo-sqlalchemy 2.x requires SQLAlchemy >=2.0 and drops support for SQLAlchemy 1.x.","severity":"breaking","affected_versions":">=2.0.0"},{"fix":"Use 'denode+pyodbc?' or 'denode://...' with 'denodo' prefix (e.g., denodo://user:pass@host:9999/db).","message":"The dialect name in connection string is 'denodo' (lowercase), not 'denodosqlalchemy' or 'Denodo'.","severity":"gotcha","affected_versions":"all"},{"fix":"Set CLASSPATH environment variable to include the Denodo JDBC JAR, or place it in the working directory.","message":"Requires Java and a JDBC driver (Denodo's JDBC JAR) to be accessible on the CLASSPATH. Without it, jaydebeapi will raise 'JavaNotFoundError' or 'RuntimeError: Class not found'.","severity":"gotcha","affected_versions":"all"}],"env_vars":null,"last_verified":"2026-05-01T00:00:00.000Z","next_check":"2026-07-30T00:00:00.000Z","problems":[{"fix":"Ensure 'denodo-sqlalchemy' is installed: pip install denodo-sqlalchemy. Then import it at least once before creating engine.","cause":"The dialect 'denodo' is not registered or installed improperly.","error":"sqlalchemy.exc.ArgumentError: Could not determine a dialect for \"denodo\""},{"fix":"Install Java (JRE or JDK) and ensure JAVA_HOME environment variable is set correctly.","cause":"JPype1 cannot locate Java installation.","error":"jaydebeapi.JavaNotFoundError: The Java runtime could not be found."},{"fix":"Download Denodo JDBC driver JAR and add its path to CLASSPATH environment variable.","cause":"Denodo JDBC driver JAR is not in CLASSPATH.","error":"RuntimeError: Class not found: com.denodo.vdb.jdbcdriver.Driver"}],"ecosystem":"pypi","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}