我们使用sqlalchemy,插入和更新工作正常,但现在我们希望将UUID从varchar迁移到varbinary。怎么做?
代码示例:
engine = create_engine(dburi, echo = True, pool_size=100, pool_recycle=7200)
db_session = scoped_session(sessionmaker(autocommit=True, bind=engine))
metadata = MetaData(engine)
conn = engine.connect()
....
table = Table("table", metadata, autoload=True)
result = db_session.execute(table.insert(), {"uuid":func.UNHEX("AABBCCDD"})
在输出中我看到
INFO sqlalchemy.engine.base.engine('unhex(:unhex_1)',)和in db-不是unhex的结果,而是unhex(:unhex_1)
我已经看到了Python-Sqlalchemy Binary Column Type HEX() and UNHEX()但是我不能评论这个,也不能理解如果我们加载结构,而不是在类中生成它会怎么样。使用db_sesson.execute().filter()?以及当我们需要“where uuid=UNHEX(?)”时如何更新?
现在如果我写为uuid=binascii.unhexlify(uuid),保存到varbinary(32)-works,保存到varchar(64),保存到charset=utf8 works表,保存到charset=ascii-exception的carchar
OperationalError: (_mysql_exceptions.OperationalError) (1366, "Incorrect string value: '\\xDB\\xE7,\\x98\\xF9\\x11...' for column 'uuid' at row 1") [SQL: u'INSERT INTO callrec (record_dt, dealer_id, client_id, extension_id, caller_id, destination, file_size, record_url, uuid, record_path, duration) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'] [parameters: (datetime.datetime(2015, 12, 2, 13, 33, 51), u'1', u'12', u'6', u'000*102', u'000*103', 67244, u'', 'P\xdb\xe7,\x98\xf9\x11\xe5\xb8\x9e\xd3\xb2v\xc0\xccZ', '', 2)]
但手动编写为uuid=UNHEX(“AABBCCDD”)已经可以工作了!
最佳答案
我认为你做插入错误,试试这个:
db_session.execute(table.insert().values(uuid=func.UNHEX("AABBCCDD")))
或者这个(非常接近你的立场):
stmt = table.insert().values(uuid=func.unhex(bindparam('hex')))
db_session.execute(stmt, {'hex': 'AABBCCDD'})
另外,如果您愿意,可以使用找到的解决方案here,为此,只需override some columns:
table = Table("model", metadata,
Column("uuid", HashColumn(20)),
autoload=True)
并执行以下指令,以便在不使用
func.*
的情况下插入:db_session.execute(table.insert().values(uuid='AABBCCDD'))