diff --git a/Database/Persist/Sqlite.hs b/Database/Persist/Sqlite.hs
--- a/Database/Persist/Sqlite.hs
+++ b/Database/Persist/Sqlite.hs
@@ -69,6 +69,7 @@
         , connEscapeName = escape
         , connNoLimit = "LIMIT -1"
         , connRDBMS = "sqlite"
+        , connLimitOffset = decorateSQLWithLimitOffset "LIMIT -1"
         }
   where
     helper t getter = do
@@ -101,20 +102,33 @@
         , stmtQuery = withStmt' conn stmt
         }
 
-insertSql' :: DBName -> [DBName] -> DBName -> InsertSqlResult
-insertSql' t cols _ =
-    ISRInsertGet (pack ins) sel
-  where
-    sel = "SELECT last_insert_rowid()"
-    ins = concat
-        [ "INSERT INTO "
-        , escape' t
-        , "("
-        , intercalate "," $ map escape' cols
-        , ") VALUES("
-        , intercalate "," (map (const "?") cols)
-        , ")"
-        ]
+insertSql' :: EntityDef SqlType -> [PersistValue] -> InsertSqlResult
+insertSql' ent vals =
+  case entityPrimary ent of
+    Just _ -> 
+      ISRManyKeys sql vals
+        where sql = pack $ concat
+                [ "INSERT INTO "
+                , escape' $ entityDB ent
+                , "("
+                , intercalate "," $ map (escape' . fieldDB) $ entityFields ent
+                , ") VALUES("
+                , intercalate "," (map (const "?") $ entityFields ent)
+                , ")"
+                ]
+    Nothing -> 
+      ISRInsertGet (pack ins) sel
+        where
+          sel = "SELECT last_insert_rowid()"
+          ins = concat
+              [ "INSERT INTO "
+              , escape' $ entityDB ent
+              , "("
+              , intercalate "," $ map (escape' . fieldDB) $ entityFields ent
+              , ") VALUES("
+              , intercalate "," (map (const "?") $ entityFields ent)
+              , ")"
+              ]
 
 execute' :: Sqlite.Connection -> Sqlite.Statement -> [PersistValue] -> IO Int64
 execute' conn stmt vals = flip finally (liftIO $ Sqlite.reset conn stmt) $ do
@@ -161,7 +175,7 @@
          -> EntityDef SqlType
          -> IO (Either [Text] [(Bool, Text)])
 migrate' allDefs getter val = do
-    let (cols, uniqs) = mkColumns allDefs val
+    let (cols, uniqs, _) = mkColumns allDefs val
     let newSql = mkCreateTable False def (filter (not . safeToRemove val . cName) cols, uniqs)
     stmt <- getter "SELECT sql FROM sqlite_master WHERE type='table' AND name=?"
     oldSql' <- runResourceT
@@ -223,7 +237,7 @@
             Just y -> error $ "Invalid result from PRAGMA table_info: " ++ show y
     table = entityDB def
     tableTmp = DBName $ unDBName table `T.append` "_backup"
-    (cols, uniqs) = mkColumns allDefs val
+    (cols, uniqs, _) = mkColumns allDefs val
     cols' = filter (not . safeToRemove def . cName) cols
     newSql = mkCreateTable False def (cols', uniqs)
     tmpSql = mkCreateTable True def { entityDB = tableTmp } (cols', uniqs)
@@ -252,21 +266,37 @@
 escape' = T.unpack . escape
 
 mkCreateTable :: Bool -> EntityDef a -> ([Column], [UniqueDef]) -> Text
-mkCreateTable isTemp entity (cols, uniqs) = T.concat
-    [ "CREATE"
-    , if isTemp then " TEMP" else ""
-    , " TABLE "
-    , escape $ entityDB entity
-    , "("
-    , escape $ entityID entity
-    , " INTEGER PRIMARY KEY"
-    , T.concat $ map sqlColumn cols
-    , T.concat $ map sqlUnique uniqs
-    , ")"
-    ]
+mkCreateTable isTemp entity (cols, uniqs) = 
+  case entityPrimary entity of 
+    Just _ -> 
+       T.concat
+        [ "CREATE"
+        , if isTemp then " TEMP" else ""
+        , " TABLE "
+        , escape $ entityDB entity
+        , "("
+        , T.drop 1 $ T.concat $ map sqlColumn cols
+        , ", PRIMARY KEY "
+        , "("
+        , T.intercalate "," $ map (escape . fieldDB) $ entityFields entity
+        , ")"
+        , ")"
+        ]
+    Nothing -> T.concat
+        [ "CREATE"
+        , if isTemp then " TEMP" else ""
+        , " TABLE "
+        , escape $ entityDB entity
+        , "("
+        , escape $ entityID entity
+        , " INTEGER PRIMARY KEY"
+        , T.concat $ map sqlColumn cols
+        , T.concat $ map sqlUnique uniqs
+        , ")"
+        ]
 
 sqlColumn :: Column -> Text
-sqlColumn (Column name isNull typ def _maxLen ref) = T.concat
+sqlColumn (Column name isNull typ def _cn _maxLen ref) = T.concat
     [ ","
     , escape name
     , " "
diff --git a/Database/Sqlite.hs b/Database/Sqlite.hs
--- a/Database/Sqlite.hs
+++ b/Database/Sqlite.hs
@@ -355,6 +355,7 @@
             PersistZonedTime (ZT d) -> bindText statement parameterIndex $ pack $ show d
             PersistList l -> bindText statement parameterIndex $ listToJSON l
             PersistMap m -> bindText statement parameterIndex $ mapToJSON m
+            PersistDbSpecific s -> bindText statement parameterIndex $ decodeUtf8With lenientDecode s
             PersistObjectId _ -> P.error "Refusing to serialize a PersistObjectId to a SQLite value"
             )
        $ zip [1..] sqlData
diff --git a/persistent-sqlite.cabal b/persistent-sqlite.cabal
--- a/persistent-sqlite.cabal
+++ b/persistent-sqlite.cabal
@@ -1,5 +1,5 @@
 name:            persistent-sqlite
-version:         1.2.1
+version:         1.3.0
 license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
@@ -20,7 +20,7 @@
     build-depends:   base                    >= 4         && < 5
                    , bytestring              >= 0.9.1
                    , transformers            >= 0.2.1
-                   , persistent              >= 1.2       && < 1.3
+                   , persistent              >= 1.3       && < 1.4
                    , monad-control           >= 0.2
                    , containers              >= 0.2
                    , text                    >= 0.7
