I get the following warnings, when trying to save a simple dataframe to 
mysql.: 

> C:\...\anaconda3\lib\site-packages\pymysql\cursors.py:170: Warning: 
(1366, "Incorrect string value: '\\x92\\xE9t\\xE9)' for column 
'VARIABLE_VALUE' at row 518")
  result = self._query(query)

And
> C:\...anaconda3\lib\site-packages\pymysql\cursors.py:170: Warning:
> (3719, "'utf8' is currently an alias for the character set UTF8MB3,
> but will be an alias for UTF8MB4 in a future release. Please consider
> using UTF8MB4 in order to be unambiguous.")   result =
> self._query(query)

Environment info : I use Mysql8, python3.6 (pymysql 0.9.2, sqlalchemy 1.2.1)

I visited posts like the one linked bellow, none of which seem to give a 
solution as to how to avoid this warning.

 - [MySQL “incorrect string value” error when save unicode string in 
Django][1] -> Indication is to use UTF8


N.B : The Collation in the table within mysql doesn't seem to be set to the 
one I specified in the `create_db` function within the `Connection` class.

The executable code:

    import DataEngine.db.Connection as connection
    import random
    import pandas as pd
    
    if __name__ == "__main__":
        conn = connection.Connection(host="host_name", port="3306", 
user="username", password="password")
        conn.create_db("raw_data")
        conn.establish("raw_data")
        l1 = []
        for i in range(100):
            l_nested = []
            for j in range(10):
                l_nested.append(random.randint(0, 100))
            l1.append(l_nested)
        df = pd.DataFrame(l1)
    
        conn.save(df, "random_df")
        # df2 = conn.retrieve("random_df")

My `Connection class`

    import sqlalchemy
    import pymysql
    import pandas as pd
    
    
    class Connection:
        def __init__(self: object, host: str, port: str, user: str, 
password: str):
            self.host = host
            self.port = port
            self.user = user
            self.password = password
            self.conn = None
    
        def create_db(self: object, db_name: str, charset: str = "utf8mb4", 
collate:str ="utf8mb4_unicode_ci",drop_if_exists: bool = True):
            c = pymysql.connect(host=self.host, user=self.user, 
password=self.password)
            if drop_if_exists:
                c.cursor().execute("DROP DATABASE IF EXISTS " + db_name)
            c.cursor().execute("CREATE DATABASE " + db_name + " CHARACTER 
SET=" + charset + " COLLATE=" + collate)
            c.close()
            print("Database %s created with a %s charset" % (db_name, 
charset))
    
        def establish(self: object, db_name: str, charset: str = "utf8mb4"):
            self.conn = sqlalchemy.create_engine(
                "mysql+pymysql://" + self.user + ":" + self.password + "@" 
+ self.host + ":" + self.port + "/" + db_name +
                "?charset=" + charset)
            print("Connection with database : %s has been established as %s 
at %s." % (db_name, self.user, self.host))
            print("Charset : %s" % charset)
    
        def retrieve(self, table):
            df = pd.read_sql_table(table, self.conn)
            return df
    
        def save(self: object, df: "Pandas.DataFrame", table: str, 
if_exists: str = "replace", chunksize: int = 10000):
            df.to_sql(name=table, con=self.conn, if_exists=if_exists, 
chunksize=chunksize)

Some elements that might help:
[![Database is of charset utf8mb4][2]][2]
[![Table columns don't seem to have the correct collation even though I 
specified it when creating the db][3]][3]


  [1]: 
https://stackoverflow.com/questions/2108824/mysql-incorrect-string-value-error-when-save-unicode-string-in-django
  [2]: https://i.stack.imgur.com/9iAPF.png
  [3]: https://i.stack.imgur.com/qBq6U.png

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to