【DM版本】:V8
【操作系统】:Windows11
【CPU】: Intel i7-13700H
【问题描述】*:sqlalchemy create_all()/drop_all()
都能成功, 新增数据的时候找不到对应的表,数据库里面是有的。。。。
【补充】:数据库机器是 Linux rocky 8.9 dm8 版本
, sqlalchemy-dm 是在开发机上-dm8客户端 下编译的
SQLAlchemy 2.0.23
sqlalchemy-dm 2.0.1
dmPython 2.5.5
python 3.11
测试demo如下
from sqlalchemy import create_engine, Index, ForeignKey, text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import Column, Integer, String
# 创建基类
Base = declarative_base()
db_schema = 'HELLO'
class BaseModel(Base):
__abstract__ = True
__table_args__ = {"schema": db_schema}
class Task(BaseModel):
__tablename__ = 'TB_TASK'
ID = Column(Integer, primary_key=True)
NAME = Column(String(50))
medias = relationship('TaskMedias', backref=f'TASK')
class TaskMedias(BaseModel):
__tablename__ = 'TB_TASK_MEDIAS'
ID = Column(Integer, primary_key=True)
GUID = Column(String(50))
TASK_ID = Column(Integer, ForeignKey(f'{db_schema}.TB_TASK.ID'))
# 添加索引
__table_args__ = (
Index('idx_guid', 'GUID', unique=True),
{"schema": db_schema},
)
# 创建数据库引擎
engine = create_engine(f"dm://SYSDBA:SYSDBA@172.16.147.212:5237", echo=True)
# 创建会话
Session = sessionmaker(bind=engine)
session = Session()
session.execute(text(f"CREATE SCHEMA {db_schema}"))
print(session.execute(text('SELECT SF_GET_CASE_SENSITIVE_FLAG()')).scalar())
# 创建所有表
Base.metadata.create_all(engine)
t = Task(NAME='task1')
session.add(t)
session.commit()
query_data = session.query(Task).all()
print(query_data)
输出:
2024-08-27 18:02:35,115 INFO sqlalchemy.engine.Engine SELECT USER FROM DUAL
2024-08-27 18:02:35,116 INFO sqlalchemy.engine.Engine [generated in 0.00032s] []
2024-08-27 18:02:35,117 INFO sqlalchemy.engine.Engine SELECT USER FROM DUAL
2024-08-27 18:02:35,118 INFO sqlalchemy.engine.Engine [cached since 0.002281s ago] []
2024-08-27 18:02:35,120 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2024-08-27 18:02:35,120 INFO sqlalchemy.engine.Engine CREATE SCHEMA HELLO
2024-08-27 18:02:35,120 INFO sqlalchemy.engine.Engine [generated in 0.00009s] []
2024-08-27 18:02:35,127 INFO sqlalchemy.engine.Engine SELECT SF_GET_CASE_SENSITIVE_FLAG()
2024-08-27 18:02:35,127 INFO sqlalchemy.engine.Engine [generated in 0.00023s] []
0
2024-08-27 18:02:35,146 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2024-08-27 18:02:35,147 INFO sqlalchemy.engine.Engine SELECT name FROM sysobjects WHERE name = ? AND schid = SF_GET_SCHEMA_ID_BY_NAME(?)
2024-08-27 18:02:35,147 INFO sqlalchemy.engine.Engine [generated in 0.00029s] ['TB_TASK', 'HELLO']
2024-08-27 18:02:35,150 INFO sqlalchemy.engine.Engine SELECT name FROM sysobjects WHERE name = ? AND schid = SF_GET_SCHEMA_ID_BY_NAME(?)
2024-08-27 18:02:35,150 INFO sqlalchemy.engine.Engine [cached since 0.003196s ago] ['TB_TASK_MEDIAS', 'HELLO']
2024-08-27 18:02:35,152 INFO sqlalchemy.engine.Engine
CREATE TABLE "HELLO"."TB_TASK" (
"ID" INTEGER NOT NULL IDENTITY(1,1),
"NAME" VARCHAR2(50 CHAR),
PRIMARY KEY ("ID")
)
2024-08-27 18:02:35,153 INFO sqlalchemy.engine.Engine [no key 0.00016s] []
2024-08-27 18:02:35,161 INFO sqlalchemy.engine.Engine
CREATE TABLE "HELLO"."TB_TASK_MEDIAS" (
"ID" INTEGER NOT NULL IDENTITY(1,1),
"GUID" VARCHAR2(50 CHAR),
"TASK_ID" INTEGER,
PRIMARY KEY ("ID"),
FOREIGN KEY("TASK_ID") REFERENCES "HELLO"."TB_TASK" ("ID")
)
2024-08-27 18:02:35,161 INFO sqlalchemy.engine.Engine [no key 0.00014s] []
2024-08-27 18:02:35,168 INFO sqlalchemy.engine.Engine CREATE UNIQUE INDEX "HELLO".idx_guid ON "HELLO"."TB_TASK_MEDIAS" ("GUID")
2024-08-27 18:02:35,168 INFO sqlalchemy.engine.Engine [no key 0.00018s] []
2024-08-27 18:02:35,177 INFO sqlalchemy.engine.Engine COMMIT
2024-08-27 18:02:35,186 INFO sqlalchemy.engine.Engine INSERT INTO "HELLO"."TB_TASK" ("NAME") VALUES (?)
2024-08-27 18:02:35,186 INFO sqlalchemy.engine.Engine [generated in 0.00026s] ['task1']
2024-08-27 18:02:35,190 INFO sqlalchemy.engine.Engine ROLLBACK
Traceback (most recent call last):
File "D:\env\py311\aiserver_env\Lib\site-packages\sqlalchemy\engine\base.py", line 1985, in _exec_single_context
result = context._setup_result_proxy()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\env\py311\aiserver_env\Lib\site-packages\sqlalchemy\engine\default.py", line 1791, in _setup_result_proxy
result = self._setup_dml_or_text_result()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\env\py311\aiserver_env\Lib\site-packages\sqlalchemy\engine\default.py", line 1876, in _setup_dml_or_text_result
self._setup_ins_pk_from_lastrowid()
File "D:\env\py311\aiserver_env\Lib\site-packages\sqlalchemy_dm-2.0.1-py3.11.egg\sqlalchemy_dm\base.py", line 1664, in _setup_ins_pk_from_lastrowid
File "D:\env\py311\aiserver_env\Lib\site-packages\sqlalchemy_dm-2.0.1-py3.11.egg\sqlalchemy_dm\base.py", line 1665, in <listcomp>
File "D:\env\py311\aiserver_env\Lib\site-packages\sqlalchemy_dm-2.0.1-py3.11.egg\sqlalchemy_dm\base.py", line 1630, in _set_autoinc_col_from_lastrowid
File "D:\env\py311\aiserver_env\Lib\site-packages\sqlalchemy_dm-2.0.1-py3.11.egg\sqlalchemy_dm\base.py", line 1825, in do_execute
File "D:\env\py311\aiserver_env\Lib\site-packages\sqlalchemy\engine\default.py", line 922, in do_execute
cursor.execute(statement, parameters)
dmPython.DatabaseError: [CODE:-2106]第1 行附近出现错误:
无效的表或视图名[TB_TASK]
model中字段设置为大写/小写 都会出现这个错误
sqlalchemy model
自增主键好像在 sqlalchemy-dm
驱动中不生效
# t = Task(NAME='task1')
t = Task(NAME='task1', ID=1)
对ID赋值后, 插入就不会报
dmPython.DatabaseError: [CODE:-2106]第1 行附近出现错误:无效的表或视图名[TB_TASK]
感觉 sqlalchemy 适配达梦任重而道远啊
将base.py
源码中 _setup_ins_pk_from_lastrowid方法
中 table.name
改为table.fullname
就可以了
statement = "select {} from {} where rowid = {}".format(autoinc_col.name, table.name, lastrowid)
statement = "select {} from {} where rowid = {}".format(autoinc_col.name, table.fullname, lastrowid)
IDENTITY(1,1),达梦数据库中不支持这种用法
自动增长列的语法与Oracle或SQL Server有所不同。达梦数据库支持自增列的创建,但不直接使用IDENTITY关键字,你通常需要在插入记录时手动指定序列值,或者通过触发器自动完成。