使用python将行插入Postgresql

使用python将行插入Postgresql,python,sql,database,postgresql,Python,Sql,Database,Postgresql,我使用python在postgreqsl中创建了一个表,并希望用包含不同数据类型的随机数据集填充它。但是我得到了错误“在字符串格式化过程中,并非所有参数都被转换。”。任何人都知道我做错了什么。我读过其他帖子,但我找不到解决办法 创建表 def create_tables(): """ create table in the PostgreSQL database""" commands = ( """ Create TABLE flight_observations(

我使用python在postgreqsl中创建了一个表,并希望用包含不同数据类型的随机数据集填充它。但是我得到了错误“在字符串格式化过程中,并非所有参数都被转换。”。任何人都知道我做错了什么。我读过其他帖子,但我找不到解决办法

创建表

def create_tables():
""" create table in the PostgreSQL database"""
commands = (
    """
    Create TABLE flight_observations(
            time TIMESTAMP,
            numDayofweek INTEGER,
            numHour INTEGER,
            ac_type TEXT,
            adep TEXT,
            ades TEXT,
            curr_sect TEXT,
            lon_t FLOAT(6),
            lat_t FLOAT(6),
            vg_t INTEGER,
            hdot_t FLOAT8,
            bearing FLOAT8,
            WCA FLOAT8,
            ws FLOAT8,
            wd FLOAT8,
            temp INTEGER
    )
    """)
conn = None
try:
    # connection string
    conn_string = "host='localhost' dbname='postgres' user='postgres' password='xxxx'"
    # print connection string to connect
    print "Connecting to database\n ->%s" % (conn_string)
    # read the connection parameters
    params = Config()
    # connect to the PostgreSQL server
    conn = psycopg2.connect(conn_string)
    cur = conn.cursor()
    # create table one by one

    cur.execute(commands)
    # close communication with the PostgreSQL database server
    cur.close()
    # commit the changes
    conn.commit()
except (Exception, psycopg2.DatabaseError) as error:
    print(error)
finally:
    if conn is not None:
        conn.close()
资料

灌装台

def insert_flight_list(flight_obs):
sql = "INSERT INTO flight_observations(time, ac_type, adep, ades, curr_sect, lon_t, lat_t, vg_t, hdot_t, bearing, wca, ws, wd, temp) VALUES ( %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
conn = None
try:
    # connection string
    conn_string = "host='localhost' dbname='postgres' user='postgres' password='xxxx'"
    # print connection string to connect
    print "Connecting to database\n ->%s" % (conn_string)
    # read database configuration
    params = Config()
    # connect to the PostgreSQL database
    conn = psycopg2.connect(conn_string)
    # create a new cursor
    cur = conn.cursor()
    # execute the INSERT statement
    cur.executemany(sql, flight_obs)
    conn.commit()
    cur.close()
except (Exception, psycopg2.DatabaseError) as error:
    print(error)
finally:
    if conn is not None:
        conn.close()

insert_flight_list(flight_obs)

不确定为什么try语句在本文中没有缩进。它们在python代码中缩进了

我认为问题在于
cur.executemany(sql,flight\u obs)
。文件说:

executemany(sql,变量列表)

对序列vars_列表中的所有参数元组或映射执行数据库操作(查询或命令)

因此,它实际上相当于:

for i in flight_obs:
    cur.execute(sql, i)
由于
flight\u obs
是一个字符串列表,而不是元组/映射,因此最终会得到如下结果:

cur.execute(sql, '2016-07-01 16:42:21')
cur.execute(sql, 'A319')
cur.execute(sql, 'EDDB')
简单修复-只需将
cur.executemany
替换为
cur.executemany
,就可以了。

在将“flight\u obs”传递给executemany()之前,将其转换为一个元组


顺便说一句,您想要“exeutemany”还是仅仅“execute”?

您的代码的哪一行给出了这个错误?是的,是的。谢谢@match。我现在自己也看到了。
cur.execute(sql, '2016-07-01 16:42:21')
cur.execute(sql, 'A319')
cur.execute(sql, 'EDDB')
cur.executemany(sql, tuple(flight_obs))