【问题标题】:How to force sqlalchemy to treat a column as a string?如何强制 sqlalchemy 将列视为字符串?
【发布时间】:2015-11-28 05:50:24
【问题描述】:

我正在使用 sqlalchemy 从 MSSQL Server 2005 中提取数据。我有一个表,其中包含一个包含诸如 0x0000000000881C3C, 0x0000000000881C3D, 0x0000000000881C3E, 0x0000000000881C3F 之类的值的列。

列类型是时间戳。我使用反射检查列类型,列类型由sqlalchemy正确确定。但是当我使用查询来提取数据时,返回的数据类型是字节数组。

对于具有以下值的源行:

0x0000000000881C3C,35,1880744, AR,2014-05-13 13:04:53.000, N, 106,  1B3448E8-4D2F-46A0-87B9-ED07411F1478, NULL, NULL

sqlalchemy返回的值如下:

(bytearray(b'\x00\x00\x00\x00\x00\x88\x1c<'), 35, 1880744, 'AR', datetime.datetime(2014, 5, 13, 13, 4, 53), 'N', 106, '1B3448E8-4D2F-46A0-87B9-ED07411F1478', None, None)

如何防止0x0000000000881C3C 被解释为字节数组?有没有办法强制 sqlalchemy 将该列视为字符串?

当我尝试将上述值插入 MongoDB 时,我遇到了问题。我尝试使用各种解码和编码组合,但似乎没有任何效果。我束手无策,希望能在这方面提供任何帮助。

这是我正在使用的代码:

engine = create_engine('mssql+pyodbc://my_uid:my_pwd@my_db')
metadata = MetaData()
conn = engine.connect()
opp_table = Table('MYTABLE', metadata, autoload=True, autoload_with=engine)
s = select([opp_table])
result = conn.execute(s)
for row in result.fetchall():
    print row

【问题讨论】:

  • 在原始 SQL 中使用相同的方式,将其转换为 varchar:sqlalchemy.sql.func.cast(db.table.column, 'VARCHAR')
  • @PauloScardine:谢谢你的建议。我编辑了我的帖子以显示我正在使用的代码。你能告诉我应该在哪里或如何准确地投专栏吗?
  • 能否也提供“CREATE TABLE”语句?

标签: python sqlalchemy


【解决方案1】:

有没有一种方法可以强制 sqlalchemy 将该列视为 字符串?

使用autoloadColumns 组合成override reflected columns

...
from sqlalchemy.types import Unicode

opp_table = Table('MYTABLE', metadata, 
                  Column('your_column_name', Unicode(30)), 
                  autoload=True, 
                  autoload_with=engine)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多