Python SQLAlchemy和Oracle-如何让VARCHAR2列使用BYTE而不是CHAR?

Python SQLAlchemy和Oracle-如何让VARCHAR2列使用BYTE而不是CHAR?,python,oracle,sqlalchemy,Python,Oracle,Sqlalchemy,看起来SQLAlchemy默认将VARCHAR2列创建为CHAR。如何使用BYTE创建它 from sqlalchemy import MetaData, Column, String from sqlalchemy.ext.declarative import declarative_base metadata = MetaData() Base = declarative_base(metadata=metadata) class Foo(Base): __tablename__

看起来SQLAlchemy默认将
VARCHAR2
列创建为
CHAR
。如何使用
BYTE
创建它

from sqlalchemy import MetaData, Column, String
from sqlalchemy.ext.declarative import declarative_base

metadata = MetaData()
Base = declarative_base(metadata=metadata)

class Foo(Base):
    __tablename__ = 'foo'
    name = Column(String(10), primary_key=True)

Foo.__table__.create(bind=engine)
这将创建下表:

创建表XXMD.FOO
(
名称VARCHAR2(10个字符)不为空
)
相反,我希望它创建以下内容:

创建表XXMD.FOO
(
名称VARCHAR2(10字节)不为空
)
多亏了:

感谢:


出于好奇:为什么?这似乎是一个混乱的来源,因为
String(10)
是一种通用类型,它使用最合适的DB类型将最大长度为10的Python字符串映射到SQL。@IljaEverilä我有另一个正在集成的系统,不幸的是它使用
BYTE
而不是
CHAR
。此外,
BYTE
是Oracle中使用的默认类型,如果没有指定的话,因此我认为
SQLAlchemy
会支持它。看看Oracle方言如何处理varchar,除非您创建自己的SQLA类型,否则无法显式定义BYTE:。出于好奇:为什么?这似乎是一个混乱的来源,因为
String(10)
是一种通用类型,它使用最合适的DB类型将最大长度为10的Python字符串映射到SQL。@IljaEverilä我有另一个正在集成的系统,不幸的是它使用
BYTE
而不是
CHAR
。此外,
BYTE
是Oracle中使用的默认类型(如果未指定),因此我认为
SQLAlchemy
将支持它。看看Oracle方言如何处理varchar,除非您创建自己的SQLA类型,否则无法显式定义BYTE:。
from sqlalchemy.ext.compiler import compiles


class VARCHAR2Byte(String):
    pass


@compiles(VARCHAR2Byte)
def compile_varchar2_byte(type_, compiler, **kw):
    len = type_.length
    return 'VARCHAR2(%i BYTE)' % len