python – 如何动态更改SQLAlchemy声明模型上的列类型?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 如何动态更改SQLAlchemy声明模型上的列类型?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2637字,纯文字阅读大概需要4分钟。
内容图文
![python – 如何动态更改SQLAlchemy声明模型上的列类型?](/upload/InfoBanner/zyjiaocheng/905/34cad6e01fe24850a0421e05546b048a.jpg)
我在生产中运行mysql但是想在内存db中的sqlite中运行一个简单的测试.
遗留的mysql db具有包含mysql特定类型的列的表,这些列在声明性模型中声明(子类化declarative_base).我想在不使用mysql的情况下运行一些简单的测试,因此需要交换模型的列.
我该怎么做呢?我已经尝试过编写一个patcher / unpatcher来替换我的模型中的表,但是当我运行一些测试时,我得到了
OperationalError: (OperationalError) near ")": syntax error u'\nCREATE TABLE my_table (\n)\n\n' ()
这让我觉得我没有正确修补列.
有谁知道我怎么做到这一点?我究竟做错了什么?
目前,我创建新列并将全新的Table对象附加到__table__并保存旧表.
创建DB,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声明模型上的列类型?全部内容,希望文章能够帮你解决python – 如何动态更改SQLAlchemy声明模型上的列类型?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。