Python脚本连接到MySQL数据库 - 代码作为过程脚本运行,在OOP重构后失败

时间:2017-05-18 18:47:53

标签: python mysql oop inheritance

我有一个脚本可以根据它通过命令行接收的输入来运行许多不同的报告。所有报告都从数据库中读取并将结果作为Pandas Dataframe对象返回。

这是超类,(省略了大量属性getter和setter函数):

import mysql.connector
import pandas as p
import config

class Report(object):

    _connection = None
    _cursor = None

    def __init__(self):
        self._user = config.user
        self._password = config.password
        self._host = config.host
        self._database = config.database
        self._port = config.port
        self._body_text = "Hello,\n\nPlease find attached these reports:\n\n"
        self._connection = mysql.connector.connect(user=self._user, password=self._password, db=self._database,
                                                   host=self._host, port=self._port)
        self._cursor = self._connection.cursor()

    @property
    def user(self):
        return self._user

    @user.setter
    def user(self, value):
        self._user = value


. . . 


    @property
    def body_text(self):
        return self._body_text

    @body_text.setter
    def body_text(self, value):
        self._body_text = value

    def append_body_text(self, value):
        self._body_text += value

    def get_data(self, server_cursor, query, columns):
        server_cursor.execute(self, query)
        results = server_cursor.fetchall()
        data = p.DataFrame(data=results, columns=[columns])
        return data

    def get_today(self):
        return self.today

    def close(self):
        self._connection_web.close()
        self._connection_raw.close()

    @staticmethod
    def insert_variables_into_sql_statement(query, external_data):
        final_query = query % external_data
        return final_query

    @staticmethod
    def create_string_from_column(serial):
        created_list = serial.tolist()
        string = ', '.join(map(str, created_list))
        return string

    @staticmethod
        def write_to_csv(data_frame, file_name):
        data_frame.to_csv(config.baseDirectory + file_name, sep=',', index=False)

    def generate_report(self):
        data = self.get_data(self._cursor_web, self._query, self._columns)
        self.write_to_csv(data, self._filename)
        self.close()

以下是我的子类的结构:

class ExampleReport(Report):
    def __init__(self):
        Report.__init__(self)
        self._query = """
        SELECT
        u.first_name AS 'First Name',
        u.last_name AS 'Last Name'
        FROM users AS u
        """
        self._columns = "'FirstName', 'LastName'"
        self._filename = "example_report.csv"
        self.append_body_text("* All users")

在我的main方法中,我调用这样的方法:

report = Reports.ExampleReport()
report.generate_report()

当我这样做时,我收到以下错误:

AttributeError: 'ExampleReport' object has no attribute 'encode'

当我的数据库连接是非常构造的过程代码(工作版本目前正在生产中)时,我的数据库连接没有问题。现在我已经破了,我试图让它面向对象。有没有人知道我做错了什么?

编辑:解决了我自己的问题!在超级类的get_data函数中,第二行包含传递给self的错误server_cursor.execute(query)参数线。一旦它被取出,错误就会消失。

1 个答案:

答案 0 :(得分:0)

解决了我自己的问题!在超类中的get_data函数中,第二行包含传递给server_cursor.execute(query)行的错误self参数。一旦它被取出,错误就会消失。