pandas to_sql和sqlalchemy

时间:2017-06-12 21:59:10

标签: python mysql pandas sqlalchemy

你需要相信我:我花了8个小时在google和stackoverflow上阅读“pandas data frame to mysql”的所有结果。

我在mysql上有以下表格

mysql> select * from mytable; 
+------+---+---+---+------------+----------+----------+
| j    | x | y | z | t          | ID       | value    |
+------+---+---+---+------------+----------+----------+
| H    | 0 | 0 | 0 |          1 | 445432   |        0 |
+------+---+---+---+------------+----------+----------+
1 row in set (0.00 sec)

类型为[CHAR, FLOAT, FLOAT, FLOAT, INT, VARCHAR, INT]

我正在尝试使用to_sqlsqlalchemy向表中编写一个pandas数据框。

我是这样开始的:

import pymysql
from sqlalchemy import create_engine
import sqlalchemy

我试着写作和阅读,一切正常。

cnx = create_engine('mysql://me:pswd@host/db', echo=False)
connection = cnx.raw_connection()

然后:

from sqlalchemy import text
sqlq = text('select * from mytable')
result = cnx.execute(sqlq)
for row in result:
    print row

正确返回表的内容。 另外,

sqli = text("insert into `mytable` value ('A', '0.',0.,0.,1,934034,0)")
insertres = cnx.execute(sqli)

正常工作。

如果我尝试通过pandas.to_mysql插入数据框,那么一切都会变得疯狂。

我试过了:

test = pd.DataFrame(data = [('3', 0., 0., 0., 1, '534523', 0)])
test.columns = ['j', 'x', 'y', 'z', 't', 'ID', 'value']

以下内容:

cnx = create_engine('mysql://me:pswd@host/db', echo=False)
connection = cnx.raw_connection()
test.to_sql('mytable', connection)

cnx = create_engine('mysql://me:pswd@host/db', echo=False)
connection = cnx.raw_connection()
test.to_sql('mytable', connection)

两者都给出错误:

DatabaseError: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': not all arguments converted during string formatting

cnx = create_engine('mysql://me:pswd@host/db', echo=False)
test.to_sql('mytable', connection, dtype = {'j': sqlalchemy.sql.sqltypes.CHAR(),
                                                  'x': sqlalchemy.sql.sqltypes.FLOAT(),
                                                  'y': sqlalchemy.sql.sqltypes.FLOAT(),
                                                  'z': sqlalchemy.sql.sqltypes.FLOAT(),
                                                  't': sqlalchemy.sql.sqltypes.INT(),
                                                  'ID': sqlalchemy.sql.sqltypes.VARCHAR(),
                                                  'value': sqlalchemy.sql.sqltypes.INT()})

给出错误:

ValueError: j (CHAR) not a string(如果我在dict中添加/删除字段,则类似)

我不知道如何解决这个问题。我试图使用原始连接(没有光标),引擎,我试图将列转换为所有可能的类型,一切。

0 个答案:

没有答案