gpt4 book ai didi

python - 如何动态更改 SQLAlchemy 声明性模型上的列类型?

转载 作者:太空宇宙 更新时间:2023-11-03 11:09:05 25 4
gpt4 key购买 nike

我在生产环境中运行 mysql,但想在内存数据库中的 sqlite 中运行一个简单的测试。

遗留的 mysql 数据库具有包含 mysql 特定类型的列的表,这些列在声明模型(子类 declarative_base)中声明。我想在不使用 mysql 的情况下运行一些简单的测试,因此需要交换模型的列。

我该怎么做?我尝试编写一个修补程序/取消修补程序来替换我模型中的 table,但是当我运行一些测试时,我得到了

OperationalError: (OperationalError) near ")": syntax error u'\nCREATE TABLE my_table (\n)\n\n' ()

这让我觉得我没有正确修补列。

有人知道我该怎么做吗?我做错了什么?

目前,我创建新列并将全新的表对象附加到 __table__ 并保存旧表。

数据库已创建,create_all() 和 convert_columns 在 setUp 中运行。 drop_all() 和 revert_columns 在我的测试中的 tearDown 期间运行

mysql_sqlite_mapping = {INTEGER: Integer,
MEDIUMINT: Integer,
TEXT: text}

def convert_columns(self, my_class, mapping):
for column in my_class.__table__.columns:
if type(column.type) in mapping:
replacement_col = Column(column.name,
mapping[type(column.type)],
primary_key=column.primary_key,
nullable=column.nullable,
key=column.key,
unique=column.unique)

converted_columns.append(replacement_col)

self.registry[my_class] = my_class.__table__

my_class.__table__.metadata.remove(my_class.__table__)
my_class.__table__ = Table(my_class.__table__.name,
my_class.__table__.metadata)

for column in converted_columns:
my_class.__table__.append_column(column)

return my_class

def revert_columns(self, my_class):
saved_table = self.registry[my_class]

metadata = my_class.__table__.metadata
my_class.__table__.metadata.remove(my_class.__table__)

model_class.__table__ = Table(saved_table.name,
metadata)

for column in saved_table.columns:
column.table = None
my_class.__table__.append_column(column)

self.registry.pop(my_class)

最佳答案

我希望以下内容可以帮助您以更好的方式处理此类修改。但是你的错误很奇怪,因为它在 CREATE TABLE 子句中没有列,所以我认为这不是你问题的直接答案/解决方案。

无论如何,与其完全替换表和列,不如尝试使用 Custom SQL Constructs and Compilation Extension / Dialect-specific compilation rules .查看应该为 sqlite 生成正确的 SQL 语句而不更改表定义的示例代码:

from sqlalchemy.ext.compiler import compiles
from sqlalchemy.dialects.mysql import MEDIUMINT, INTEGER, TEXT

@compiles(MEDIUMINT, 'sqlite')
def compile_MEDIUMINT(element, compiler, **kw):
""" Handles mysql MEDIUMINT datatype as Integer in sqlite. """
return compiler.visit_integer(element, **kw)

@compiles(INTEGER, 'sqlite')
def compile_INTEGER(element, compiler, **kw):
""" Handles mysql INTEGER datatype as Integer in sqlite. """
return compiler.visit_integer(element, **kw)


@compiles(TEXT, 'sqlite')
def compile_TEXT(element, compiler, **kw):
""" Handles mysql TEXT datatype as text in sqlite. """
return compiler.visit_text(element, **kw)

关于python - 如何动态更改 SQLAlchemy 声明性模型上的列类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10558965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com