我正在尝试使用精灵代码创建一个数据库。但是,我面临着文档的问题,所以我在这里问!
这可能被认为是不直观的,因为我可以直接在命令行上运行SQLite并创建数据集。
我尝试用Python模拟的代码是:
#--------------------------------------
import apsw
#--------------------------------------
# Opening/creating database. Database name is cookbook.db3
connection=apsw.Connection("cookbook.db3")
cursor=connection.cursor()
#--------------------------------------
# Create The Tables
#--------------------------------------
sql = 'CREATE TABLE Recipes (pkiD INTEGER PRIMARY KEY, name TEXT, servings TEXT, source TEXT)'
cursor.execute(sql)
sql = 'CREATE TABLE Instructions (pkID INTEGER PRIMARY KEY, instructions TEXT, recipeID NUMERIC)'
cursor.execute(sql)
sql = 'CREATE TABLE Ingredients (pkID INTEGER PRIMARY KEY, ingredients TEXT, recipeID NUMERIC)'
cursor.execute(sql)
#--------------------------------------
# Insert Data into tables
#--------------------------------------
# Insert data into Recipe table
sql = 'INSERT INTO Recipes (name,servings,source) VALUES ("Spanish Rice",4,"Greg")'
cursor.execute(sql)
# Get the pkid for the inserted record
sql = "SELECT last_insert_rowid()"
cursor.execute(sql)
for x in cursor.execute(sql):
lastid = x[0]
# Insert data into the instructions table
sql = 'INSERT INTO Instructions (recipeID,instructions) VALUES( %s,"Brown hamburger. Stir in all other ingredients. Bring to a boil. Stir. Lower to simmer. Cover and cook for 20 minutes or until all liquid is absorbed.")' % lastid
cursor.execute(sql)
# Insert data into the ingredients table
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"1 cup parboiled Rice (uncooked)")' % lastid
cursor.execute(sql)
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"1 pound Hamburger")' % lastid
cursor.execute(sql)
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"2 cups Water")' % lastid
cursor.execute(sql)
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"1 8 oz can Tomato Sauce")' % lastid
cursor.execute(sql)
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"1 small Onion chopped")' % lastid
cursor.execute(sql)
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"1 clove Garlic chopped")' % lastid
cursor.execute(sql)
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"1 tablespoon Ground Cumin")' % lastid
cursor.execute(sql)
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"1 teaspoon Ground Oregano")' % lastid
cursor.execute(sql)
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"Salt and Pepper to taste")' % lastid
cursor.execute(sql)
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"Salsa to taste")' % lastid
cursor.execute(sql)
# Put in one more for good "measure"
sql = 'INSERT INTO Recipes (name,servings,source) VALUES ("Pickled Pepper-Onion Relish","9 half pints","Complete Guide to Home Canning")'
cursor.execute(sql)
# Get the pkid for the inserted record
sql = "SELECT last_insert_rowid()"
cursor.execute(sql)
for x in cursor.execute(sql):
lastid = x[0]
sql = 'INSERT INTO Instructions (recipeID,instructions) VALUES( %s,"Wash and chop vegetables. Combine all ingredients and boil gently until mixture thickens and volume is reduced by 1/2 (about 30 minutes). Fill sterile jars with hot relish, leaving 1/2 inch head space and seal tightly. Store in refrigerator and use within one month or process in boiling water bath if extended storage is desired. Hot pack process time at 0-1000 feet for 5 minutes, 1,001 to 6000 ft 10 minutes, above 6,000 ft 15 minutes.")' % lastid
cursor.execute(sql)
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"6 cups finely chopped Onions")' % lastid
cursor.execute(sql)
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"3 cups finely chopped Red Peppers")' % lastid
cursor.execute(sql)
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"3 cups finely chopped Green Peppers")' % lastid
cursor.execute(sql)
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"1 1/2 cups sugar")' % lastid
cursor.execute(sql)
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"6 cups White Vinegar (5 percent)")' % lastid
cursor.execute(sql)
sql = 'INSERT INTO Ingredients (recipeID,ingredients) VALUES ( %s,"2 tablespoons canning or pickling salt")' % lastid
cursor.execute(sql)
# Tell us we are done
print 'Done'
我已经学会了如何使用vala.doc,并且找到了操作SQLite数据库的例程:SQLite. Database。但是,我总是在编译时遇到错误。
以下是我复制代码的进展:
/* HOW TO CREATE THE DB WITH GENIE */
// Opening/creating db.
[indent=4]
init
Sqlite.Database db
string errmsg
int ec = Sqlite.Database.open("cookbook.db", out db)
if ec != Sqlite.OK
stderr.printf("Can't open database: %d: Ss\n", db.errcode(), db.errmesg)
return -1
// Insert data
query:string ="""
CREATE TABLE Recipes (pkiD INTEGER PRIMARY KEY, name TEXT, servings TEXT, source TEXT)
"""
db.exec (query, null, out errmsg)
它本来是要插入表到数据库中,但我得到了以下错误:
valac --pkg sqlite3 cookcreate.gs
cookcreate.gs:9.11-9.11: error: syntax error, expected `:' but got `.' with previous identifier
Sqlite.Database db
^
Compilation failed: 1 error(s), 0 warning(s)
1条答案
按热度按时间xtupzzrd1#
看起来好像您已经在Valadoc中使用了这个示例,但是没有将类型信息从Vala语法转换为Genie语法,因此
Sqlite.Database db
应该是db:Sqlite.Database
。Genie中的一个工作示例是:
有几点需要注意:
return -1
。这可能会在某些时候更改,请参阅https://bugzilla.gnome.org/show_bug.cgi?id=707233。要解决此问题,您可以使用GLib的进程。exit(),就像上面的例子中使用的那样。这样做的缺点是程序会立即终止,而不会破坏对象。因此,如果您在类中使用final
来关闭数据库连接,例如,final
块将不会被调用。或者您可以只调用return
,它总是返回0"""I'm a verbatim string"""
非常适合在Genie中嵌入SQL:-)