简体   繁体   中英

xampp - python 3.7 - mysql error 1146 table not found

File: init.py

import sys
import time
import importlib

create_database = importlib.import_module("create-database")
from settings import *

create_database.import_tables_structure()
time.sleep(2)

import_settings()
time.sleep(2)

File: create-database.py

import mysql.connector
import sys
import os
import traceback

def import_tables_structure():
    try:
        cnx = mysql.connector.connect(user='root', password='',host='localhost')
        cursor = cnx.cursor()
        sql_file = open("papinhio-player.sql","r",encoding="utf-8").read()
        cursor.execute(sql_file,multi=True)
        cnx.commit()
        cursor.close()
        cnx.close() 
    except Exception as e:
        error_message = traceback.format_exc()
        print(error_message)

    #make folders
    try:
        os.mkdir(os.path.abspath("C:\\Users\\chris\\My Projects\\papinhio-player\\disket-box\\reports\\history-report"))
        os.mkdir(os.path.abspath("C:\\Users\\chris\\My Projects\\papinhio-player\\disket-box\\reports\\listeners-statistics-report"))
        os.mkdir(os.path.abspath("C:\\Users\\chris\\My Projects\\papinhio-player\\disket-box\\reports\\schedule-transmition-report"))
        os.mkdir(os.path.abspath("C:\\Users\\chris\\My Projects\\papinhio-player\\disket-box\\reports\\week-report"))

        os.mkdir(os.path.abspath("C:\\Users\\chris\\My Projects\\papinhio-player\\disket-box\\records\\ip-calls"))
    except:
        pass
        
#import_tables_structure()

File: papinhio-player.sql

-- phpMyAdmin SQL Dump
-- version 5.1.1deb5ubuntu1
-- https://www.phpmyadmin.net/
--
-- Host: localhost:3306
-- Generation Time: Aug 02, 2022 at 07:57 PM
-- Server version: 10.6.7-MariaDB-2ubuntu1.1
-- PHP Version: 8.1.2

SET SQL_MODE = "";
START TRANSACTION;

--
-- Database: `papinhio-player`
--

DROP DATABASE IF EXISTS `papinhio-player`;
CREATE DATABASE IF NOT EXISTS `papinhio-player` COLLATE utf8_general_ci;
-- --------------------------------------------------------

-- Table: settings
-- Used for saving program settings
-- such as auto_dj value (0,1)
-- Easy table (only 3 columns)

CREATE TABLE `papinhio-player`.`settings` (
  `id` int(11) NOT NULL,
  `setting` varchar(255) NOT NULL,
  `value` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

--
-- Indexes for table `settings`
--
ALTER TABLE `papinhio-player`.`settings`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `setting` (`setting`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `settings`
--
ALTER TABLE `papinhio-player`.`settings`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- Constraints for dumped tables
--
COMMIT;

File: settings.py

import os
import sys

import mysql.connector

def import_settings():

    system_sound_volume = 50

    #default_font = "Times New Roman"
    default_font = "Calibri"
    default_font_size = 18
    default_font_color = "#000000"
    default_background_color = "#F1F1F1"
    default_buttons_background = "#F5F5F5"
    default_buttons_font_color = "#000000"
    #default_style = "WindowsVista"
    default_style = "Fusion"
    #default_custome_theme = "light_blue.xml"
    default_custome_theme = ""

    sql = """ INSERT INTO `settings` (`keyword`, `current_value`) VALUES ( ?, ?) """
    settings = []

    settings.append(("input_device_sound_volume",100))
    settings.append(("input_device_normalize",0))
    settings.append(("input_device_pan",0))
    settings.append(("input_device_low_frequency",20))
    settings.append(("input_device_high_frequency",20000))
    
    settings.append(("general_deck_sound_volume",50))
    settings.append(("general_deck_normalize",0))
    settings.append(("general_deck_pan",0))
    settings.append(("general_deck_low_frequency",20))
    settings.append(("general_deck_high_frequency",20000))
    
    settings.append(("player_list_display","Προβολή λίστας"))
    
    
    settings.append(("deck_1_relative_type",""))
    settings.append(("deck_1_relative_number",0))
    settings.append(("deck_1_current_duration_milliseconds",0))
    settings.append(("deck_1_repeats",0))
    settings.append(("deck_1_status",0))
    settings.append(("deck_1_total_time_milliseconds",0))

    settings.append(("deck_2_relative_type",""))
    settings.append(("deck_2_relative_number",0))
    settings.append(("deck_2_current_duration_milliseconds",0))
    settings.append(("deck_2_repeats",0))
    settings.append(("deck_2_status",0))
    settings.append(("deck_2_total_time_milliseconds",0))
    
    settings.append(("music_clip_deck_relative_type",""))    
    settings.append(("music_clip_deck_relative_number",0))    
    settings.append(("music_clip_deck_current_duration_milliseconds",0))       
    settings.append(("music_clip_deck_repeats",0))   
    settings.append(("music_clip_deck_status",0))
    settings.append(("music_clip_deck_total_time_milliseconds",0))
    
    
    settings.append(("default_font",default_font))
    settings.append(("default_font_size",default_font_size))
    settings.append(("default_font_color",default_font_color))
    settings.append(("default_background_color",default_background_color))
    settings.append(("default_button_background",default_buttons_background))
    settings.append(("default_button_font_color",default_buttons_font_color))
    settings.append(("default_style",default_style))
    settings.append(("default_custome_theme",default_custome_theme))
    
    settings.append(("player_field_change_position","1"))
    settings.append(("player_field_play","1"))
    settings.append(("player_field_title","1"))
    settings.append(("player_field_last_play","1"))
    settings.append(("player_field_next_play","1"))
    settings.append(("player_field_image","1"))
    settings.append(("player_field_prepare","1"))
    settings.append(("player_field_play_now","1"))
    settings.append(("player_field_remove","1"))
    settings.append(("player_field_duration","1"))
    settings.append(("player_field_artist","1"))
    settings.append(("player_field_album","1"))
    settings.append(("player_field_author","1"))
    settings.append(("player_field_composer","1"))
    settings.append(("player_field_year","1"))
    settings.append(("player_field_description","1"))
    settings.append(("player_field_from","1"))
    settings.append(("player_field_rating","1"))
    settings.append(("player_field_volume","1"))
    settings.append(("player_field_normalize","1"))
    settings.append(("player_field_pan","1"))
    settings.append(("player_field_frequencies","1"))
    settings.append(("player_field_repeat","1"))
    settings.append(("player_field_open_file","1"))

    settings.append(("player_fade_in","0"))
    settings.append(("player_fade_out","0"))
    
    settings.append(("program_component_tool_bar","1"))
    settings.append(("program_component_time_lines","1"))
    settings.append(("program_component_general_deck","1"))
    settings.append(("program_component_deck_1","1"))
    settings.append(("program_component_deck_2","1"))
    settings.append(("program_component_music_clip_deck","1"))
    settings.append(("program_component_speackers_deck","1"))
    settings.append(("program_component_ip_calls","0"))
    settings.append(("program_component_player_list","1"))
    settings.append(("program_component_web_sites","1"))
    settings.append(("program_component_scheduled_transmitions","1"))
    
    settings.append(("repeat_player_list","1"))
    settings.append(("auto_dj","1"))
    settings.append(("current-working-directory",os.path.abspath(".")))

    cnx = mysql.connector.connect(user='root', password='',host='localhost',database='papinhio-player')
    cursor = cnx.cursor()
    cursor.execute("SET GLOBAL sql_mode='';")
    cnx.commit()
    cursor.execute("USE `papinhio-player`;")
    cnx.commit()    
    for setting in settings:
        sql = "INSERT INTO `papinhio-player`.`settings` (`setting`,`value`) VALUES (%s, %s);"
        cursor.execute(sql,(str(setting[0]),str(setting[1])))
        cnx.commit()
    cursor.close()
    cnx.close()

If i run init.py the output is:

Traceback (most recent call last):
  File "C:\Users\chris\My Projects\papinhio-player\database\create-database.py",
 line 12, in import_tables_structure
    cnx.commit()
  File "C:\python\lib\site-packages\mysql\connector\connection_cext.py", line 42
5, in commit
    self._cmysql.commit()
_mysql_connector.MySQLInterfaceError: Commands out of sync; you can't run this c
ommand now

Traceback (most recent call last):
  File "C:\python\lib\site-packages\mysql\connector\connection_cext.py", line 53
8, in cmd_query
    query_attrs=self._query_attrs)
_mysql_connector.MySQLInterfaceError: Table 'papinhio-player.settings' doesn't e
xist

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "init_2.py", line 10, in <module>
    import_settings()
  File "C:\Users\chris\My Projects\papinhio-player\database\settings.py", line 1
66, in import_settings
    cursor.execute(sql,(str(setting[0]),str(setting[1])))
  File "C:\python\lib\site-packages\mysql\connector\cursor_cext.py", line 271, i
n execute
    raw_as_string=self._raw_as_string)
  File "C:\python\lib\site-packages\mysql\connector\connection_cext.py", line 54
1, in cmd_query
    sqlstate=exc.sqlstate)
mysql.connector.errors.ProgrammingError: 1146 (42S02): Table 'papinhio-player.se
ttings' doesn't exist

the database and table structure are created, but no insertion to settings table.

Then if i run python settings.py the insertions are done. What's the problem? Note: I tried multi=True in multi-query but then there is no database build in phpmyadmin.

File: create-database.py

import mysql.connector
import sys
import os
import traceback
import re

def import_tables_structure():
    try:
        cnx = mysql.connector.connect(user='root', password='',host='localhost')
        cursor = cnx.cursor()
        exec_sql_file(cursor, "papinhio-player.sql")
    except Exception as e:
        error_message = traceback.format_exc()
        print(error_message)

    #make folders
    try:
        os.mkdir(os.path.abspath("C:\\Users\\chris\\My Projects\\papinhio-player\\disket-box\\reports\\history-report"))
        os.mkdir(os.path.abspath("C:\\Users\\chris\\My Projects\\papinhio-player\\disket-box\\reports\\listeners-statistics-report"))
        os.mkdir(os.path.abspath("C:\\Users\\chris\\My Projects\\papinhio-player\\disket-box\\reports\\schedule-transmition-report"))
        os.mkdir(os.path.abspath("C:\\Users\\chris\\My Projects\\papinhio-player\\disket-box\\reports\\week-report"))

        os.mkdir(os.path.abspath("C:\\Users\\chris\\My Projects\\papinhio-player\\disket-box\\records\\ip-calls"))
    except:
        pass

def exec_sql_file(cursor, sql_file):
    statement = ""

    for line in open(sql_file,"r",encoding="utf-8"):
        if re.match(r'--', line):  # ignore sql comment lines
            continue
        if not re.search(r';$', line):  # keep appending lines that don't end in ';'
            statement = statement + line
        else:  # when you get a line ending in ';' then exec statement and reset for next statement
            statement = statement + line
            #print "\n\n[DEBUG] Executing SQL statement:\n%s" % (statement)
            try:
                cursor.execute(statement)
            except Exception as e:
                print(e)
                #print "\n[WARN] MySQLError during execute statement \n\tArgs: '%s'" % (str(e.args))

            statement = ""

#import_tables_structure()

The problem may was that with one mysql execution there is no enough time to apply the changes in mysql.

In this answer i use a sql file parser to execution one single query at one execution.

Now the settings insertions are done with no mistake.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM