簡體   English   中英

具有自動加載表的Python-Sqlalchemy二進制列類型HEX()和UNHEX()

[英]Python-Sqlalchemy Binary Column Type HEX() and UNHEX() with autoloaded table

我們使用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"})

在輸出中我看到了

信息sqlalchemy.engine.base.Engine('unhex(:unhex_1)',)和db-不是UNHEX的結果而是UNHEX(:UNHEX_1)

我已經看過Python-Sqlalchemy Binary Column Type HEX()和UNHEX(),但我無法對此發表評論,也無法理解如果我們加載結構而不是在類中生成結構該怎么辦。 使用db_sesson.execute()。filter()嗎? 以及當我們需要“ where uuid = UNHEX(?)”時如何更新?

現在,如果我以uuid = binascii.unhexlify(uuid)的形式編寫,則保存到varbinary(32)-有效,使用表charset = utf8可以保存到varchar(64),使用charset = ascii可以保存到char-

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'})

另外,如果需要,您可以使用在此處找到的解決方案,為此,只需覆蓋一些列即可

table = Table("model", metadata, 
        Column("uuid", HashColumn(20)), 
        autoload=True)

並執行以下指令以便不使用func.*進行插入:

db_session.execute(table.insert().values(uuid='AABBCCDD'))
class HashColumn(VARBINARY):
  def bind_expression(self, bindvalue):
  #bindvalue = type_coerce(bindvalue, Binary)
  return func.unhex(func.replace(bindvalue, '-', ''))

  def column_expression(self, col):
    return func.lower(func.hex(col))

def select(table_name):
  table = Table(table_name, self.metadata, Column("uuid", HashColumn(20)), autoload=True, extend_existing=True)
  select = table.select()
  ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM