簡體   English   中英

嘗試添加數據並使用sqlobject和python 3查詢mysql數據庫

[英]trying to add data and query a mysql database using sqlobject and python 3

我的代碼提出了一個異常,如下所示。 我很確定問題出在表關系的定義上。 我嘗試了多種選擇,它們會給出不同的錯誤:-(

我擁有一個可以具有一個或多個MacAddress的許可證,如下所示:

class MacAddress(sqlobject.SQLObject):
    # noinspection PyPep8Naming,PyClassHasNoInit
    class sqlmeta:
        table = "mac_address_table"

    mac_address = sqlobject.StringCol(unique=True, length=50)
    license = sqlobject.ForeignKey('License', default=None)


class License(sqlobject.SQLObject):
    # noinspection PyPep8Naming,PyClassHasNoInit
    class sqlmeta:
        table = "license_table"

    user_name = sqlobject.StringCol(unique=True, length=50)
    mac_addresses = sqlobject.MultipleJoin('MacAddress')

    @staticmethod
    def create(user_name, mac_address):
        lic = License(user_name=user_name)
        mac = MacAddress.get(mac_address)
        lic.add_mac_address(mac)
        return lic

    def add_mac_address(self, mac_address):
        mac_address.license = self

    @staticmethod
    def is_valid(user_name, mac_address):
        query = License.selectBy(user_name=user_name)
        found = False
        if query.count() != 0:
            lic = query.getOne()
            # Here is where I am having a problem:
            for mac in lic.mac_addresses:
                if mac.mac_address == mac_address:
                    found = True
                    break
            if found:
                return True
        return False

當我嘗試像這樣測試許可證時:

lic.is_valid(user_name="Fred", mac_address="1234"),

我在這一行收到錯誤:對於lic.mac_addresses中的mac:

我收到以下錯誤:

sqlobject.dberrors.OperationalError: Unknown column 'license_table_id' in 'where clause'

我的數據庫中有以下表格:

mac_address_table:

+----------------------+---------+------+-----+---------+-------+
| Field                | Type    | Null | Key | Default | Extra |
+----------------------+---------+------+-----+---------+-------+
| license_table_id     | int(11) | NO   |     | NULL    |       |
| mac_address_table_id | int(11) | NO   |     | NULL    |       |
+----------------------+---------+------+-----+---------+-------+

license_table:

+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| id        | int(11)     | NO   | PRI | NULL    | auto_increment |
| user_name | varchar(50) | YES  | UNI | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+

mac_address_table_license_table:

+----------------------+---------+------+-----+---------+-------+
| Field                | Type    | Null | Key | Default | Extra |
+----------------------+---------+------+-----+---------+-------+
| license_table_id     | int(11) | NO   |     | NULL    |       |
| mac_address_table_id | int(11) | NO   |     | NULL    |       |
+----------------------+---------+------+-----+---------+-------+

這是數據庫的內容:

    select * from license_table; select * from mac_address_table; select * from license_table_mac_address_table;
+----+-----------+----------+---------------------+
| id | user_name | password | created             |
+----+-----------+----------+---------------------+
|  1 | Fred      | xxx      | 2019-04-29 17:59:47 |
+----+-----------+----------+---------------------+
    1 row in set (0.00 sec)


+----+-------------+------------+
| id | mac_address | license_id |
+----+-------------+------------+
|  1 | 1234        |          1 |
+----+-------------+------------+
1 row in set (0.00 sec)

+------------------+----------------------+
| license_table_id | mac_address_table_id |
+------------------+----------------------+
|                1 |                    1 |
+------------------+----------------------+

SQLObject需要知道SQLObject列。 幫忙一點:

class License(sqlobject.SQLObject):
    class sqlmeta:
        table = "license_table"

    user_name = sqlobject.StringCol(unique=True, length=50)
    mac_addresses = sqlobject.MultipleJoin('MacAddress', joinColumn='license_id')

這里的關鍵部分是joinColumn='license_id'

PS。 與您的問題沒有直接關系:

    if query.count() != 0:
        lic = query.getOne()

在這里,您運行查詢兩次。 我建議優化:

    try:
        lic = query.getOne()
    except sqlobject.SQLObjectNotFound:
        return False
    else:
        for mac in lic.mac_addresses:
            …

我似乎已修復它:

class MacAddress(sqlobject.SQLObject):
    # noinspection PyPep8Naming,PyClassHasNoInit
    class sqlmeta:
        table = "mac_address_table"

    value = sqlobject.StringCol(unique=True, length=50)
    license = sqlobject.ForeignKey('License', default=None)


class License(sqlobject.SQLObject):
    # noinspection PyPep8Naming,PyClassHasNoInit
    class sqlmeta:
        table = "license_table"

    user_name = sqlobject.StringCol(unique=True, length=50)
    mac_addresses = sqlobject.MultipleJoin('MacAddress', joinColumn='license_id')

    @staticmethod
    def create(user_name, mac_address):
        lic = License(user_name=user_name)
        lic.add_mac_address(mac_address=mac_address)
        return lic

    def add_mac_address(self, mac_address):
        mac_address.license = self

    @staticmethod
    def is_valid(user_name, mac_str):
        query = License.selectBy(user_name=user_name)
        found = False
        if query.count() != 0:
            lic = query.getOne()
            for mac in lic.mac_addresses:
                if mac_str == mac.value:
                    found = True
                    break
            if found:
                return True
        return False

現在工作正常:

def test_license():
    mac_address = MacAddress(value="123")
    lic = License.create(user_name="Fred", mac_address=mac_address)
    mac_address = MacAddress(value="2468")
    lic.add_mac_address(mac_address=mac_address)
    print(lic.is_valid(user_name="Fred", mac_str=mac_address.value))
    print(lic.is_valid(user_name="Fred", mac_str="3456"))

我不知道要做什么來糾正此錯誤,除非這有點像在MacAddress中重寫SQLObject get方法之類的事情。謝謝您的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM