2017-08-01 83 views
0

它看起來像SQLAlchemy默認爲創建VARCHAR2列作爲CHAR。我怎樣才能用​​來創造它呢?SQLAlchemy和Oracle - 如何讓VARCHAR2列使用BYTE而不是CHAR?

 
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) 

這將創建如下表:

 
CREATE TABLE XXMD.FOO 
(
    NAME VARCHAR2(10 CHAR)      NOT NULL 
) 

相反,我想它創建以下文件:

 
CREATE TABLE XXMD.FOO 
(
    NAME VARCHAR2(10 BYTE)      NOT NULL 
) 
+0

出的好奇心:爲什麼?這似乎是一個混淆的來源,因爲String(10)是一個泛型類型,它使用最合適的DB類型將最長爲10的Python字符串映射到SQL。 –

+0

@IljaEverilä我有另一個系統,我不幸使用'BYTE'而不是'CHAR'。此外,'BYTE'是Oracle中使用的默認類型(如果沒有指定),所以我認爲'SQLAlchemy'會支持它。 –

+0

看看Oracle方言如何處理varchar,沒有辦法明確定義BYTE:https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/dialects/oracle/base.py#L592,禁止你創建您自己的SQLA類型。 –

回答

0

感謝Mike Bayer

 
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 

相關問題