【问题标题】:How to use Python SQLAlchemy ORM with MonetDB and database schema如何将 Python SQLAlchemy ORM 与 MonetDB 和数据库模式一起使用
【发布时间】:2020-07-24 19:28:38
【问题描述】:

我尝试将 Python SQLAlchemy ORM 与 MonetDB 和数据库架构一起使用,但遗憾的是失败了。

演示我的问题的最小示例如下:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

engine = create_engine(f"monetdb://monetdb:monetdb@localhost:50000/demo")
connection = engine.connect()

Session = sessionmaker(bind=engine)
session = Session()

class Template(object):

    __table_args__ = ({"schema": "test"}, )

Base = declarative_base(cls=Template)

class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True)
    name = Column(String)

schemas = [name[0] for name in connection.execute("SELECT name FROM sys.schemas")]
if not "test" in schemas:
    connection.execute("CREATE SCHEMA test")

Base.metadata.create_all(bind=engine)

session.add_all([User(name="a"), User(name="b"), User(name="c")])
session.commit()

print(session.query(User).one())

这应该适用于干净/空的 MonetDB 数据库(例如 Windows 中的演示数据库)。

如果上面的例子运行,会抛出类似下面的错误:

Traceback (most recent call last):
  File "C:\some\path\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1278, in _execute_context
    cursor, statement, parameters, context
  File "C:\some\path\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 593, in do_execute
    cursor.execute(statement, parameters)
  File "C:\some\path\Anaconda3\lib\site-packages\pymonetdb\sql\cursors.py", line 165, in execute
    block = self.connection.execute(query)
  File "C:\some\path\Anaconda3\lib\site-packages\pymonetdb\sql\connections.py", line 140, in execute
    return self.command('s' + query + '\n;')
  File "C:\some\path\Anaconda3\lib\site-packages\pymonetdb\sql\connections.py", line 145, in command
    return self.mapi.cmd(command)
  File "C:\some\path\Anaconda3\lib\site-packages\pymonetdb\mapi.py", line 266, in cmd
    raise exception(msg)
pymonetdb.exceptions.OperationalError: 42000!TODO: column names of level >= 3


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "test.py", line 42, in <module>
    print(session.query(User).one())
  File "C:\some\path\Anaconda3\lib\site-packages\sqlalchemy\orm\query.py", line 3458, in one
    ret = self.one_or_none()
  File "C:\some\path\Anaconda3\lib\site-packages\sqlalchemy\orm\query.py", line 3427, in one_or_none
    ret = list(self)
  File "C:\some\path\Anaconda3\lib\site-packages\sqlalchemy\orm\query.py", line 3503, in __iter__
    return self._execute_and_instances(context)
  File "C:\some\path\Anaconda3\lib\site-packages\sqlalchemy\orm\query.py", line 3528, in _execute_and_instances
    result = conn.execute(querycontext.statement, self._params)
  File "C:\some\path\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1014, in execute
    return meth(self, multiparams, params)
  File "C:\some\path\Anaconda3\lib\site-packages\sqlalchemy\sql\elements.py", line 298, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "C:\some\path\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1133, in _execute_clauseelement
    distilled_params,
  File "C:\some\path\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1318, in _execute_context
    e, statement, parameters, cursor, context
  File "C:\some\path\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1512, in _handle_dbapi_exception
    sqlalchemy_exception, with_traceback=exc_info[2], from_=e
  File "C:\some\path\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 178, in raise_
    raise exception
  File "C:\some\path\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1278, in _execute_context
    cursor, statement, parameters, context
  File "C:\some\path\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 593, in do_execute
    cursor.execute(statement, parameters)
  File "C:\some\path\Anaconda3\lib\site-packages\pymonetdb\sql\cursors.py", line 165, in execute
    block = self.connection.execute(query)
  File "C:\some\path\Anaconda3\lib\site-packages\pymonetdb\sql\connections.py", line 140, in execute
    return self.command('s' + query + '\n;')
  File "C:\some\path\Anaconda3\lib\site-packages\pymonetdb\sql\connections.py", line 145, in command
    return self.mapi.cmd(command)
  File "C:\some\path\Anaconda3\lib\site-packages\pymonetdb\mapi.py", line 266, in cmd
    raise exception(msg)
sqlalchemy.exc.OperationalError: (pymonetdb.exceptions.OperationalError) 42000!TODO: column names of level >= 3

[SQL: SELECT test.users.id AS test_users_id, test.users."name" AS test_users_name
FROM test.users]
(Background on this error at: http://sqlalche.me/e/13/e3q8)

下面是 Windows 上新启动的 MonetDB 服务器的日志在这种情况下的样子:

# MonetDB 5 server v11.37.7 (Jun2020)
# Serving database 'demo', using 8 threads
# Compiled for x86_64-pc-winnt/64bit
# Found 63.847 GiB available main-memory of which we use 52.036 GiB
# Copyright (c) 1993 - July 2008 CWI.
# Copyright (c) August 2008 - 2020 MonetDB B.V., all rights reserved
# Visit https://www.monetdb.org/ for further information
# Listening for connection requests on mapi:monetdb://127.0.0.1:50000/
# SQL catalog created, loading sql scripts once
# loading sql script: 09_like.sql
# loading sql script: 10_math.sql
# loading sql script: 12_url.sql
# loading sql script: 13_date.sql
# loading sql script: 14_inet.sql
# loading sql script: 15_querylog.sql
# loading sql script: 16_tracelog.sql
# loading sql script: 17_temporal.sql
# loading sql script: 18_index.sql
# loading sql script: 20_vacuum.sql
# loading sql script: 21_dependency_views.sql
# loading sql script: 22_clients.sql
# loading sql script: 23_skyserver.sql
# loading sql script: 25_debug.sql
# loading sql script: 26_sysmon.sql
# loading sql script: 27_rejects.sql
# loading sql script: 39_analytics.sql
# loading sql script: 40_json.sql
# loading sql script: 41_md5sum.sql
# loading sql script: 45_uuid.sql
# loading sql script: 46_profiler.sql
# loading sql script: 51_sys_schema_extension.sql
# loading sql script: 58_hot_snapshot.sql
# loading sql script: 60_wlcr.sql
# loading sql script: 61_wlcr.sql
# loading sql script: 75_storagemodel.sql
# loading sql script: 80_statistics.sql
# loading sql script: 80_udf.sql
# loading sql script: 81_tracer.sql
# loading sql script: 90_generator.sql
# loading sql script: 99_system.sql
# MonetDB/SQL module loaded
# MonetDB server is started. To stop server press Ctrl-C.
#client1: createExceptionInternal: !ERROR: ParseException:SQLparser:42000!TODO: column names of level >= 3

好像是查询

SELECT test.users.id AS test_users_id, test.users."name" AS test_users_name FROM test.users

MonetDB API/驱动程序无法正确处理。

也可以找到相关的错误报告:

遗憾的是,这些错误是在大约 20 年首次提到的。 2010 年这个问题可能不会很快得到解决(或者根本不会)。

最后是一些版本信息:

  • 系统:Windows 10 1809
  • MonetDB:20200529
  • 蟒蛇:3.7.7
  • pymonetdb: 1.3.1
  • sqlalchemy:1.3.18
  • sqlalchemy-monetdb: 1.0.0

有谁知道解决此问题的方法,例如告诉 SQLAlchemy ORM 使用临时别名等?

【问题讨论】:

    标签: python-3.x sqlalchemy schema monetdb


    【解决方案1】:

    确实,MonetDB 仍然不支持超过两个级别的命名。但它仍在我们的列表中,而您的问题只是增加了它的位置。

    我对 SQLAlchemy 了解不多。您是否有机会找到解决此问题的方法?

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 2019-10-07
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2013-10-07
      • 2010-11-21
      • 2010-12-29
      • 2012-09-01
      相关资源
      最近更新 更多