我正在尝试使用Genie代码创建数据库。但是,我在文档方面遇到了问题,所以我在这里问!
这可以认为是不直观的,因为我可以直接在命令行上运行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)
任何帮助将不胜感激。
似乎您已经在Valadoc中使用了该示例,但是没有将类型信息从Vala语法转换为Genie语法。所以Sqlite.Database db会db:Sqlite.Database。
Sqlite.Database db
db:Sqlite.Database
Genie中的一个有效示例是:
[indent=4] init db:Sqlite.Database errmsg:string ec:int = Sqlite.Database.open("cookbook.sqlite", out db) if ec != Sqlite.OK stderr.printf("Can't open database: %d: %s\n", db.errcode(), db.errmsg()) Process.exit( -1 ) query:string ="""CREATE TABLE Recipes ( pkiD INTEGER PRIMARY KEY, name TEXT, servings TEXT, source TEXT ) """ db.exec (query, null, out errmsg)
需要注意的几件事:
return -1
final
return
"""I'm a verbatim string"""