无法使用 if_exists='append' 从 Pandas 数据帧填充 MySQL 数据库

BCA*_*Arg 2 mysql python-3.x pandas

我正在尝试编写一个脚本来使用多个 Pandas 数据框填充 mySQL 数据库。为简单起见,我将在此处演示使用单个 Pandas df 填充数据库的代码

我按如下方式连接到数据库:

导入 mysql.connector 导入熊猫作为 pd

# create the cursor and the connector
conn = mysql.connector.connect(
        host='localhost',
        user='root',
        password='my_password')

c = conn.cursor(buffered=True)

# Create the database
c.execute('CREATE DATABASE IF NOT EXISTS ss_json_interop')


# Connect now to the ss_json_interop database
conn = mysql.connector.connect(
            host='localhost',
            user='root',
            password='my_password', 
            database='ss_json_interop')

c = conn.cursor(buffered=True)



#### Create the table
c.execute("""CREATE TABLE IF NOT EXISTS sample_sheet_stats_json (
        ss_ID int NOT NULL AUTO_INCREMENT,
        panel text,
        run_ID text,
        sample_ID text,
        i7_index_ID text,
        i7_index_seq text,
        i5_index_ID text,
        i5_index_seq text,
        number_reads_lane1 varchar(255),
        number_reads_lane2 varchar(255),
        total_reads varchar(255),
        PRIMARY KEY (ss_ID)
        )""")


#### create the engine
# more here: /sf/ask/1153348941/
database_username = 'root'
database_password = 'my_password'
database_ip       = '127.0.0.1'
database_name     = 'ss_json_interop'
database_connection = sqlalchemy.create_engine('mysql+mysqlconnector://{0}:{1}@{2}/{3}'.
                                               format(database_username, database_password, 
                                                      database_ip, database_name))

# define the engine
engine = create_engine("mysql+mysqldb://root:my_password@localhost/sample_sheet_stats_json")
Run Code Online (Sandbox Code Playgroud)

我正在尝试将 my 填充df到名为sample_sheet_stats_json. 如果我做:

df.to_sql('sample_sheet_stats_json', con=database_connection, if_exists='replace')
Run Code Online (Sandbox Code Playgroud)

该命令有效并且数据库中的表已正确填充。但是,如果我取代if_exists='replace'if_exists='append'

df.to_sql('sample_sheet_stats_json', con=database_connection, if_exists='append')
Run Code Online (Sandbox Code Playgroud)

我收到一条很长的错误消息,如下所示:(错误消息不完整。它继续复制我的结构 df

(mysql.connector.errors.ProgrammingError) 1054 (42S22): Unknown column 'index' in 'field list' [SQL: 'INSERT INTO sample_sheet_stats_json 
Run Code Online (Sandbox Code Playgroud)

奇怪的是,只要我运行,即如果表已经填充,我就可以做到。df.to_sql('sample_sheet_stats_json', con=database_connection, if_exists='append')df.to_sql('sample_sheet_stats_json', con=database_connection, if_exists='replace before')

这里已经报告同样的问题。但是,如果我这样做:

df.to_sql('sample_sheet_stats_json', engine, if_exists='append')
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

(_mysql_exceptions.OperationalError) (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)") (Background on this error at: http://sqlalche.me/e/e3q8)
Run Code Online (Sandbox Code Playgroud)

这没有多大意义,因为我已经可以使用其他命令连接到数据库,如上所示。

有谁知道我该如何解决?

BCA*_*Arg 7

我已经弄清楚发生了什么。错误消息告诉我们在 Pandas 数据框中没有列索引,这实际上是正确的。

因此,我必须简单地index=False使用命令传递参数df.to_sql('sample_sheet_stats_json', con=database_connection, if_exists='append')

df.to_sql('sample_sheet_stats_json', con=database_connection, if_exists='append', index=False)
Run Code Online (Sandbox Code Playgroud)

这解决了问题。