2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Странная ошибка в SQLite3
Сообщение14.08.2020, 15:57 


21/05/16
4292
Аделаида
Даны три таблицы: chat (с полями id, type, authorid, message, created), players (с полями id, accountid) и chatnew (с такими же полями, что и chat). Необходимо скопировать все записи из chat в chatnew, изменив authorid в соответствии с players. Я сделал так:
Используется синтаксис SQL
INSERT INTO chatnew (id, TYPE, authorid, message, created) SELECT m.id, m.TYPE, p.accountid, m.message, m.created FROM chat m LEFT OUTER JOIN players p ON p.id = m.authorid

Но SQLite3 возвращает ошибку "ERROR: RIGHT and FULL OUTER JOINs are not currently supported", несмотря на то, что их там нет.

 Профиль  
                  
 
 Re: Странная ошибка в SQLite3
Сообщение15.08.2020, 09:39 


21/05/16
4292
Аделаида
Я вот сейчас подумал (точнее, посмотрел на то, как форум оформил код)... type что, ключевое слово в SQL?

 Профиль  
                  
 
 Re: Странная ошибка в SQLite3
Сообщение15.08.2020, 13:40 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
kotenok gav в сообщении #1479252 писал(а):
type что, ключевое слово в SQL?
Stack Overflow. Is “type” a reserved word in mysql.

 Профиль  
                  
 
 Re: Странная ошибка в SQLite3
Сообщение15.08.2020, 13:42 


21/05/16
4292
Аделаида
Хм... Может ли быть, что ошибка именно из-за этого?

 Профиль  
                  
 
 Re: Странная ошибка в SQLite3
Сообщение15.08.2020, 14:45 
Заслуженный участник


15/05/05
3445
USA
kotenok gav в сообщении #1479252 писал(а):
type что, ключевое слово в SQL?
В этой таблице ключевых слов SQLite слова "TYPE" нет:

 Профиль  
                  
 
 Re: Странная ошибка в SQLite3
Сообщение17.08.2020, 18:34 
Заслуженный участник


15/05/05
3445
USA
Сделал небольшой пример на Windows 10 (Python 3.8, SQLite3).
>>> sqlite3.version
'2.6.0'
>>> sqlite3.sqlite_version
'3.28.0'

Ошибок не наблюдал.

1. Скрипт создает три таблицы (chat, players и chatnew) и заполняет первые две.
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
import sqlite3 as sl

con = sl.connect('kotenok-gav.db')

with con:
    con.execute("""
        CREATE TABLE CHAT (
            id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
            type TEXT,
            authorid INTEGER,
            message TEXT,
            created TEXT
        );
    """
)

    con.execute("""
        CREATE TABLE PLAYERS (
            id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
            accountid INTEGER
        );
    """
)

    con.execute("""
        CREATE TABLE CHATNEW (
            id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
            type TEXT,
            authorid INTEGER,
            message TEXT,
            created TEXT
        );
    """
)

sql = 'INSERT INTO chat (id, type, authorid, message, created) values(?, ?, ?, ?, ?)'
data = [
    (101, "typ1", 1, "msg1", "cre1"),
    (102, "typ2", 2, "msg2", "cre2"),
    (103, "typ3", 2, "msg3", "cre3"),
    (104, "typ4", 3, "msg4", "cre4")
]
with con:
    con.executemany(sql, data)

with con:
    data = con.execute("SELECT * FROM chat")
    for row in data:
        print(row)

sql = 'INSERT INTO PLAYERS (id, accountid) values(?, ?)'
data = [
    (1, 21),
    (2, 22),
    (3, 23)
]
with con:
    con.executemany(sql, data)

with con:
    data = con.execute("SELECT * FROM PLAYERS")
    for row in data:
        print(row)
 


2. Скрипт выполняет LEFT OUTER JOIN
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
import sqlite3 as sl

con = sl.connect('kotenok-gav.db')

sql = """INSERT INTO chatnew (id, TYPE, authorid, message, created)
         SELECT m.id, m.TYPE, p.accountid, m.message, m.created FROM chat m
         LEFT OUTER JOIN players p ON p.id = m.authorid"""


with con:
    con.execute(sql)

with con:
    data = con.execute("SELECT * FROM chatnew")
    for row in data:
        print(row)
 

 Профиль  
                  
 
 Re: Странная ошибка в SQLite3
Сообщение17.08.2020, 18:42 


21/05/16
4292
Аделаида
Почему-то сейчас оно сработало... Не знаю, в чем было дело.

 Профиль  
                  
 
 Re: Странная ошибка в SQLite3
Сообщение11.10.2020, 16:50 


21/05/16
4292
Аделаида
А можно ли как-нибудь изменить запрос, чтобы он, если строки с подходящим id в players нет, писал вместо accountid не NULL, а сам id?

 Профиль  
                  
 
 Re: Странная ошибка в SQLite3
Сообщение11.10.2020, 16:55 
Заслуженный участник


16/02/13
4214
Владивосток
Ну, в некоторых SQL можно написать что-то типа if(isnull(p.accountid), m.id, p.accountid)

 Профиль  
                  
 
 Re: Странная ошибка в SQLite3
Сообщение11.10.2020, 16:57 


21/05/16
4292
Аделаида
iifat, спасибо! Погуглил, нашел в SQLite3 функцию IIF.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group