代码之家  ›  专栏  ›  技术社区  ›  Guido Flohr

带参数的Pandas read_sql为PostgreSQL数据库提供“TypeError:dict不是序列”

  •  0
  • Guido Flohr  · 技术社区  · 2 年前

    我正在尝试使用Pandas的SQL查询参数:

    import pandas as pd
    from sqlalchemy import create_engine
    
    engine = create_engine('postgresql:///mydb')
    conn = engine.connect()
    sql = '''
    SELECT id, name, age FROM person WHERE name=%{name}s
    '''
    
    df = pd.read_sql(sql, conn, params={'name': 'John Doe'})
    print(df)
    

    从我对 Pandas documentation 这应该有效。但它抛出了一个“类型错误:dict不是序列”。

    解决方案是将SQL封装在 text() 来自SQLAlchemy,并使用不同的占位符语法:

    import pandas as pd
    from sqlalchemy import create_engine, text
    
    engine = create_engine('postgresql:///mydb')
    conn = engine.connect()
    sql = '''
    SELECT id, name, age FROM person WHERE name=:name
    '''
    
    df = pd.read_sql(text(sql), conn, params={'name': 'John Doe'})
    print(df)
    

    我很擅长使用 文本 因为它使代码也独立于后端。但是,第一种方法有什么问题?IMHO,它完全遵循文档。

    1 回复  |  直到 2 年前
        1
  •  1
  •   jlandercy    2 年前

    应为括号而非大括号:

    import pandas as pd
    from sqlalchemy import create_engine
    
    engine = create_engine('postgresql:///mydb')
    conn = engine.connect()
    sql = '''
    SELECT id, name, age FROM person WHERE name=%(name)s
    '''
    
    df = pd.read_sql(sql, conn, params={'name': 'John Doe'})
    print(df)