如何从Dataframe在mysql数据库中创建新表

ovfsdjhp  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(604)

最近,我从使用sqlite来满足大部分数据存储和管理需求过渡到mysql。我想我终于安装了正确的库来使用python3.6,但是现在我很难从mysql数据库中的dataframe创建新表。
以下是我导入的库:

  1. import pandas as pd
  2. import mysql.connector
  3. from sqlalchemy import create_engine

在我的代码中,我首先从csv文件创建一个Dataframe(这里没有问题)。

  1. def csv_to_df(infile):
  2. return pd.read_csv(infile)

然后我使用以下def函数建立到mysql数据库的连接:

  1. def mysql_connection():
  2. user = 'root'
  3. password = 'abc'
  4. host = '127.0.0.1'
  5. port = '3306'
  6. database = 'a001_db'
  7. engine = create_engine("mysql://{0}:{1}@{2}:{3}/{4}?charset=utf8".format(user, password, host, port, database))
  8. return engine

最后,我使用pandas函数“to\ u sql”在mysql数据库中创建数据库表:

  1. def df_to_mysql(df, db_tbl_name, conn=mysql_connection(), index=False):
  2. df.to_sql(con = conn, name = db_tbl_name, if_exists='replace', index = False)

我使用以下行运行代码:

  1. df_to_mysql(csv_to_df(r'path/to/file.csv'), 'new_database_table')

将产生以下错误:

  1. InvalidRequestError: Could not reflect: requested table(s) not available in Engine(mysql://root:***@127.0.0.1:3306/a001_db?charset=utf8): (new_database_table)

我想这是在告诉我,在将dataframe中的数据传递给这个表之前,必须首先在数据库中创建一个表,但我不是100%肯定。不管怎样,我正在寻找一种在mysql数据库中创建表的方法,而不必首先手动创建表(我有许多csv,每个csv有50多个字段,它们必须作为mysql数据库中的新表上传)。
有什么建议吗?

n8ghc7c1

n8ghc7c11#

  1. connection = engine.connect()
  2. df.to_sql(con=connection, name='TBL_NAME', schema='SCHEMA', index=False, if_exists='replace')

在特定的架构中使用oracledb时不会出错,但如果权限有限,则不会工作。注意表名是区分大小写的。

lpwwtiir

lpwwtiir2#

我采用了上面aws\u学徒建议的方法,即先创建表,然后将数据写入表。
下面的代码首先从df(自动定义表名和数据类型)自动生成一个mysql表,然后将df数据写入该表。
我必须克服几个小问题,例如:未命名的csv列,为mysql表中的每个字段确定正确的数据类型。
我相信有很多其他的方法可以做到这一点,但这似乎是可行的。

  1. import pandas as pd
  2. from sqlalchemy import create_engine
  3. infile = r'path/to/file.csv'
  4. db = 'a001_db'
  5. db_tbl_name = 'a001_rd004_db004'
  6. '''
  7. Load a csv file into a dataframe; if csv does not have headers, use the headers arg to create a list of headers; rename unnamed columns to conform to mysql column requirements
  8. '''
  9. def csv_to_df(infile, headers = []):
  10. if len(headers) == 0:
  11. df = pd.read_csv(infile)
  12. else:
  13. df = pd.read_csv(infile, header = None)
  14. df.columns = headers
  15. for r in range(10):
  16. try:
  17. df.rename( columns={'Unnamed: {0}'.format(r):'Unnamed{0}'.format(r)}, inplace=True )
  18. except:
  19. pass
  20. return df
  21. '''
  22. Create a mapping of df dtypes to mysql data types (not perfect, but close enough)
  23. '''
  24. def dtype_mapping():
  25. return {'object' : 'TEXT',
  26. 'int64' : 'INT',
  27. 'float64' : 'FLOAT',
  28. 'datetime64' : 'DATETIME',
  29. 'bool' : 'TINYINT',
  30. 'category' : 'TEXT',
  31. 'timedelta[ns]' : 'TEXT'}
  32. '''
  33. Create a sqlalchemy engine
  34. '''
  35. def mysql_engine(user = 'root', password = 'abc', host = '127.0.0.1', port = '3306', database = 'a001_db'):
  36. engine = create_engine("mysql://{0}:{1}@{2}:{3}/{4}?charset=utf8".format(user, password, host, port, database))
  37. return engine
  38. '''
  39. Create a mysql connection from sqlalchemy engine
  40. '''
  41. def mysql_conn(engine):
  42. conn = engine.raw_connection()
  43. return conn
  44. '''
  45. Create sql input for table names and types
  46. '''
  47. def gen_tbl_cols_sql(df):
  48. dmap = dtype_mapping()
  49. sql = "pi_db_uid INT AUTO_INCREMENT PRIMARY KEY"
  50. df1 = df.rename(columns = {"" : "nocolname"})
  51. hdrs = df1.dtypes.index
  52. hdrs_list = [(hdr, str(df1[hdr].dtype)) for hdr in hdrs]
  53. for i, hl in enumerate(hdrs_list):
  54. sql += " ,{0} {1}".format(hl[0], dmap[hl[1]])
  55. return sql
  56. '''
  57. Create a mysql table from a df
  58. '''
  59. def create_mysql_tbl_schema(df, conn, db, tbl_name):
  60. tbl_cols_sql = gen_tbl_cols_sql(df)
  61. sql = "USE {0}; CREATE TABLE {1} ({2})".format(db, tbl_name, tbl_cols_sql)
  62. cur = conn.cursor()
  63. cur.execute(sql)
  64. cur.close()
  65. conn.commit()
  66. '''
  67. Write df data to newly create mysql table
  68. '''
  69. def df_to_mysql(df, engine, tbl_name):
  70. df.to_sql(tbl_name, engine, if_exists='replace')
  71. df = csv_to_df(infile)
  72. create_mysql_tbl_schema(df, mysql_conn(mysql_engine()), db, db_tbl_name)
  73. df_to_mysql(df, mysql_engine(), db_tbl_name)
展开查看全部

相关问题