【问题标题】:How to use python to execute mysql and use replace into - with more than 255 variables ?如何使用python执行mysql并使用replace into - 超过255个变量?
【发布时间】:2013-01-15 15:46:41
【问题描述】:

下面是我正在使用的代码

con.execute("""
REPLACE INTO T(var1,var2,...,var300)VALUES(?,?,....?)""",(var1,var2,...,var300)

如果我有 var1-var255 ,这个语句就可以正常工作,一旦我有更多它给了我一个错误...... 到目前为止,我能够将 T 分成 2 个不同的时间

con.execute("""
REPLACE INTO T(var1,var2,...,var150)VALUES(?,?,....?)""",(var1,var2,...,var150)

con.execute("""
REPLACE INTO T(var151,var152,...,var300)VALUES(?,?,....?)""",(var151,var152,...,var300)

这没有给我任何错误,但我在表“T”中的最终值只会在第二个执行语句中的值,所有 var1, var2, ... var 150 都被替换为 null

【问题讨论】:

  • 你到底是怎么得到一个 300 列的表的?
  • 那是很多列..
  • 这可能是 MySQL 二进制协议的限制,其中绑定具有 8 位无符号标识符。无论如何,有这么多列,你是在玩火。
  • 请发布您收到的确切错误消息。
  • 请告诉我们您使用的是什么 MySQL/Python 驱动程序。

标签: python mysql extract etl


【解决方案1】:

您是否尝试过改用更新?

MySQL 文档说明如下: "REPLACE 的工作方式与 INSERT 完全相同,只是如果表中的旧行与 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,则在插入新行之前删除旧行"

【讨论】:

    【解决方案2】:

    在 MySQL 中使用超过 255 列,与 MySQLdb 接口似乎没有任何固有问题:

    import MySQLdb
    import config
    
    connection = MySQLdb.connect(
        host = config.HOST, user = config.USER,
        passwd = config.PASS, db = 'test')
    cursor = connection.cursor()
    
    cols = ['col{i:d}'.format(i =i) for i in range(300)]
    types = ['int(11)']*len(cols)
    columns = ','.join('{f} {t}'.format(f = f, t = t) for f, t in zip(cols, types))
    
    sql = '''CREATE TABLE IF NOT EXISTS test (
           id INT(11) NOT NULL AUTO_INCREMENT,
           {c},
           PRIMARY KEY (id) 
           )'''.format(c = columns)
    
    cursor.execute(sql)
    
    sql = '''REPLACE INTO test({c}) VALUES ({v})'''.format(
        c = ','.join(cols),
        v = ','.join(['%s']*len(cols)))
    
    cursor.execute(sql, range(300))
    result = cursor.fetchall()
    

    这会毫无问题地向test.test 添加行。

    【讨论】:

      猜你喜欢
      • 2010-09-05
      • 2014-02-11
      • 2019-07-15
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      相关资源
      最近更新 更多