![](/img/trans.png)
[英]ruby on rails: multiple insertion SQLite3::SQLException: near “,”: syntax error:
[英]What does the "SQLite3::SQLException: near ".": syntax error" mean?
我正在编写一个 ORM(对象关系模型)并且我已经被这个错误消息困住了一段时间。 我确实将其缩小到更新和保存方法(我感觉错误最有可能特别是在更新方法中),但我无法弄清楚语法错误发生在哪里。
这是错误消息:
SQLite3::SQLException: near ".": syntax error
from /Users/karenlee/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/sqlite3-1.4.1/lib/sqlite3/database.rb:147:in `initialize'
这是我的 ORM:
require_relative 'questions_database'
class User
attr_reader :id
attr_accessor :fname, :lname
# displays all users
def self.all
users = QuestionsDatabase.instance.execute("SELECT * FROM users")
users.map { | user_info | User.new(user_info) }
end
# finds a user by their primary id
def self.find_by_id(id)
found_user = QuestionsDatabase.instance.execute(<<-SQL, id: id)
SELECT
users.*
FROM
users
WHERE
users.id = :id
SQL
found_user.nil? ? nil : User.new(found_user.first)
end
# finds a user by their first and last name
def self.find_by_name(fname, lname)
name = {fname: fname, lname: lname}
found_user = QuestionsDatabase.instance.execute(<<-SQL, name)
SELECT
users.*
FROM
users
WHERE
users.fname = :fname AND users.lname = :lname
SQL
found_user.nil? ? nil : User.new(found_user.first)
end
# creates a new user instance
def initialize(options)
@id, @fname, @lname = options.values_at('id', 'fname', 'lname')
end
# saves the user into the database (or updates when needed)
def save
if self.id
update
else
create
end
end
private
# helper method to update the database
def update
values = {id: id, fname: fname, lname: lname}
QuestionsDatabase.instance.execute(<<-SQL, values)
UPDATE
users
SET
users.fname = :fname, users.lname = :lname
WHERE
users.id = :id
SQL
end
# helper method to create a row in the database
def create
name = {fname: fname, lname: lname}
QuestionsDatabase.instance.execute(<<-SQL, name)
INSERT INTO
users (fname, lname)
VALUES
(:fname, :lname)
SQL
self.id = QuestionsDatabase.instance.last_insert_row_id
end
end
如果需要,这里是 QuestionsDatabase 类:
require 'sqlite3'
require 'singleton'
class QuestionsDatabase < SQLite3::Database
include Singleton
def initialize
super('questions.db')
self.type_translation = true
self.results_as_hash = true
end
end
更新:
我找到了我的错误所在! 原来我应该说fname = :fname, lname = :lname
而不是users.fname = :fname, users.lname = :lname
。 但我仍然不确定为什么会这样。 当我不使用别名时,更新语句似乎不喜欢它,但是对此进行更多解释会很棒!
事实证明,别名仅在 FROM 子句中可用。 因此,如果我要在 UPDATE 语句中使用别名,则它的结构必须有所不同; 我必须使用 FROM 子句。 有关重组的更多信息,请参阅此链接!
https://sqlstudies.com/2013/09/16/dba-myths-you-cant-use-an-alias-in-an-update-statement/
原来我应该说 fname = :fname, lname = :lname 而不是 users.fname = :fname, users.lname = :lname。 但我仍然不确定为什么会这样。
如果您查看UPDATE
语法图,您会看到它只采用简单的列名。 不需要指定表名,因为一次只能更新一个表; 没有像SELECT
那样含糊不清的余地。 因此解析器规则不支持可选的表名组件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.