From f846a2487c3d7c14f07e7f9b3d5aa0d803733ed9 Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Sat, 8 Mar 2014 17:26:53 +0100 Subject: get rid of lastrowid usage On psycopg2 the lastrowid attribute is always 0. The documentation advises to use inserted_primary_key instead, but in order to use that, the sqlalchemy expression language must be used. --- dedup/schema.py | 16 ++++++++++++++++ readyaml.py | 9 +++++---- 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 dedup/schema.py diff --git a/dedup/schema.py b/dedup/schema.py new file mode 100644 index 0000000..569408f --- /dev/null +++ b/dedup/schema.py @@ -0,0 +1,16 @@ +import sqlalchemy + +metadata = sqlalchemy.MetaData() + +package = sqlalchemy.Table("package", metadata, + sqlalchemy.Column('id', sqlalchemy.Integer, primary_key=True), + sqlalchemy.Column('name', sqlalchemy.Text, unique=True), + sqlalchemy.Column('version', sqlalchemy.Text), + sqlalchemy.Column('architecture', sqlalchemy.Text), + sqlalchemy.Column('source', sqlalchemy.Text)) + +content = sqlalchemy.Table("content", metadata, + sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True), + sqlalchemy.Column("pid", None, sqlalchemy.ForeignKey("package.id")), + sqlalchemy.Column("filename", sqlalchemy.Text), + sqlalchemy.Column("size", sqlalchemy.Integer)) diff --git a/readyaml.py b/readyaml.py index 8ba82fa..fac3c40 100755 --- a/readyaml.py +++ b/readyaml.py @@ -9,6 +9,7 @@ from debian.debian_support import version_compare import sqlalchemy import yaml +from dedup import schema from dedup.utils import configure_database_engine def readyaml(conn, stream): @@ -36,10 +37,10 @@ def readyaml(conn, stream): architecture=metadata["architecture"], source=metadata["source"], pid=pid) else: - pid = conn.execute(sqlalchemy.text("INSERT INTO package (name, version, architecture, source) VALUES (:name, :version, :architecture, :source);"), + pid = conn.execute(schema.package.insert().values( name=package, version=metadata["version"], architecture=metadata["architecture"], - source=metadata["source"]).lastrowid + source=metadata["source"])).inserted_primary_key[0] if metadata["depends"]: conn.execute(sqlalchemy.text("INSERT INTO dependency (pid, required) VALUES (:pid, :required);"), [dict(pid=pid, required=dep) @@ -48,9 +49,9 @@ def readyaml(conn, stream): if entry == "commit": return - cur = conn.execute(sqlalchemy.text("INSERT INTO content (pid, filename, size) VALUES (:pid, :filename, :size);"), + cid = conn.execute(schema.content.insert().values( pid=pid, filename=entry["name"], size=entry["size"]) - cid = cur.lastrowid + ).inserted_primary_key[0] if entry["hashes"]: conn.execute(sqlalchemy.text("INSERT INTO hash (cid, fid, hash) VALUES (:cid, :fid, :hash);"), [dict(cid=cid, fid=funcmapping[func], hash=hexhash) -- cgit v1.2.3