2014 dxdy logo

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

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




 
 Странная ошибка в SQLite3
Сообщение14.08.2020, 15:57 
Даны три таблицы: 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 
Я вот сейчас подумал (точнее, посмотрел на то, как форум оформил код)... type что, ключевое слово в SQL?

 
 
 
 Re: Странная ошибка в SQLite3
Сообщение15.08.2020, 13:40 
Аватара пользователя
kotenok gav в сообщении #1479252 писал(а):
type что, ключевое слово в SQL?
Stack Overflow. Is “type” a reserved word in mysql.

 
 
 
 Re: Странная ошибка в SQLite3
Сообщение15.08.2020, 13:42 
Хм... Может ли быть, что ошибка именно из-за этого?

 
 
 
 Re: Странная ошибка в SQLite3
Сообщение15.08.2020, 14:45 
kotenok gav в сообщении #1479252 писал(а):
type что, ключевое слово в SQL?
В этой таблице ключевых слов SQLite слова "TYPE" нет:

 
 
 
 Re: Странная ошибка в SQLite3
Сообщение17.08.2020, 18:34 
Сделал небольшой пример на 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 
Почему-то сейчас оно сработало... Не знаю, в чем было дело.

 
 
 
 Re: Странная ошибка в SQLite3
Сообщение11.10.2020, 16:50 
А можно ли как-нибудь изменить запрос, чтобы он, если строки с подходящим id в players нет, писал вместо accountid не NULL, а сам id?

 
 
 
 Re: Странная ошибка в SQLite3
Сообщение11.10.2020, 16:55 
Ну, в некоторых SQL можно написать что-то типа if(isnull(p.accountid), m.id, p.accountid)

 
 
 
 Re: Странная ошибка в SQLite3
Сообщение11.10.2020, 16:57 
iifat, спасибо! Погуглил, нашел в SQLite3 функцию IIF.

 
 
 [ Сообщений: 10 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group